Este tutorial apresenta as operações básicas do MongoDB na perspectiva da linguagem Golang.

Nota: Este tutorial utiliza o pacote de driver oficial da linguagem Go fornecido pelo MongoDB.

Tutoriais Prévios

Tutorial do MongoDB

Nota: Se não estiver familiarizado com o MongoDB, por favor estude primeiro o conhecimento do MongoDB. O tutorial do Golang não repetirá o conhecimento relevante.

Requisitos Básicos

  • Go 1.10 ou superior
  • MongoDB 2.6 ou superior

Instalar Dependências

go get go.mongodb.org/mongo-driver/mongo

Conectar ao MongoDB

import (
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

// Endereço de conexão MongoDB
uri := "mongodb://localhost:27017"
// Obter o objeto de contexto, você pode definir um timeout
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// Conectar ao MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))

A função Connect não bloqueia a goroutine. Ou seja, operar diretamente o MongoDB após chamar o método de Conectar pode resultar em um erro porque o MongoDB ainda não foi conectado com sucesso. Você pode usar o método Ping para verificar se o MongoDB foi conectado com sucesso.

// Ping no MongoDB, se conectado com sucesso, não retorna erro
err = client.Ping(ctx, readpref.Primary())

Endereço de Conexão MongoDB

O endereço de conexão MongoDB inclui informações importantes como o endereço do servidor, número da porta, conta e senha. O formato é o seguinte:

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

Exemplo:

// Conecta ao endereço localhost:27017 com o nome de usuário e senha padrão
mongodb://localhost:27017

// Conecta ao endereço localhost:27017 com a conta=root, senha=123456 e conecta ao banco de dados padrão=admin
mongodb://root:123456@localhost:27017/admin

Liberar Recursos de Conexão

Se a conexão não for mais necessária, você precisa liberar manualmente os recursos de conexão.

defer func() {
    if err = client.Disconnect(ctx); err != nil {
        panic(err)
    }
}()

Obter Instância da Coleção

Para operar o MongoDB em Golang, você precisa obter primeiro a instância da coleção e depois pode realizar operações CRUD na instância da coleção.

// Defina o nome do banco de dados através de Database e o nome da coleção através de Collection
coleção := client.Database("teste").Collection("números")

Nota: De acordo com as características do MongoDB, não é necessário criar o banco de dados e a coleção antecipadamente. Eles serão criados automaticamente quando os dados forem escritos pela primeira vez.

Inserir Documento

Utilize a função InsertOne para inserir dados.

// Objeto de contexto, comumente usado para definir o tempo limite da requisição, você também pode reutilizar o objeto de contexto criado anteriormente, sem necessidade de redefini-lo
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Inserir documento, aqui utilizamos o tipo bson.D para descrever o documento JSON, bson.D representa um array JSON
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})

// Obter o ID do documento recém-adicionado
id := res.InsertedID

Você precisa importar os seguintes pacotes:

import (
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "go.mongodb.org/mongo-driver/mongo/readpref"
)

Nota: Em Golang, o pacote bson é utilizado para representar a estrutura de dados do documento JSON. Os próximos capítulos detalharão a expressão das estruturas de armazenamento de dados do MongoDB em Golang.

package main

import (
	"context"
	"fmt"
	"time"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
)

func main() {
	// Definir o endereço de conexão com o MongoDB
	uri := "mongodb://root:123456@localhost:27017/admin"
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	// Conectar ao MongoDB
	client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
	if err != nil {
		panic(err)
	}

	defer func() {
		// Liberar a conexão com atraso
		if err = client.Disconnect(ctx); err != nil {
			panic(err)
		}
	}()

	// Verificar se a conexão com o MongoDB foi bem-sucedida
	if err := client.Ping(ctx, readpref.Primary()); err != nil {
		panic(err)
	}
	fmt.Println("Conexão com o MongoDB estabelecida com sucesso!")

	// Obter a coleção de números
	collection := client.Database("testing").Collection("numbers")

	// Inserir um documento
	res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
	id := res.InsertedID
	fmt.Println("Novo ID do documento=", id)
}