Этот учебник представляет основные операции MongoDB с точки зрения языка Golang.

Примечание: В этом учебнике используется официальный пакет драйвера языка Go, предоставленный MongoDB.

Учебники, необходимые для начала

Учебник по MongoDB

Примечание: Если вы не знакомы с MongoDB, пожалуйста, сначала изучите материалы по MongoDB. Учебник по Golang не будет повторять соответствующие знания.

Основные требования

  • Go 1.10 или выше
  • MongoDB 2.6 или выше

Установка зависимостей

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

Подключение к MongoDB

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

// Адрес подключения к MongoDB
uri := "mongodb://localhost:27017"
// Получить объект контекста, можно установить время ожидания
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()

// Подключение к MongoDB
client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))

Функция Connect не блокирует горутину. Это означает, что прямая работа с MongoDB после вызова метода Connect может привести к ошибке, поскольку MongoDB еще не был успешно подключен. Вы можете использовать метод Ping, чтобы проверить успешное подключение к MongoDB.

// Пинг MongoDB, если подключение успешно, ошибки не возвращаются
err = client.Ping(ctx, readpref.Primary())

Адрес подключения к MongoDB

Адрес подключения к MongoDB содержит важную информацию, такую как адрес сервера, номер порта, учетные данные и пароль. Формат такой:

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

Пример:

// Подключение к адресу localhost:27017 с использованием имени пользователя и пароля по умолчанию
mongodb://localhost:27017

// Подключение к адресу localhost:27017 с учетной записью root, паролем 123456 и подключением к базе данных по умолчанию=admin
mongodb://root:123456@localhost:27017/admin

Освобождение ресурсов подключения

Если подключение больше не нужно, вам нужно вручную освободить ресурсы подключения.

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

Получение экземпляра коллекции

Для работы с MongoDB в Golang сначала нужно получить экземпляр коллекции, а затем можно выполнять операции CRUD на экземпляре коллекции.

// Установите имя базы данных через Database и установите имя коллекции через Collection
collection := client.Database("testing").Collection("numbers")

Примечание: В соответствии с особенностями MongoDB не обязательно создавать базу данных и коллекцию заранее. Они будут созданы автоматически при первой записи данных.

Вставка документа

Используйте функцию InsertOne для вставки данных.

// Объект контекста, обычно используется для установки времени ожидания запроса, вы также можете повторно использовать ранее созданный объект контекста, нет необходимости в его переопределении
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Вставка документа, здесь мы используем тип bson.D для описания JSON-документа, bson.D представляет собой массив JSON
res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})

// Получение идентификатора нового добавленного документа
id := res.InsertedID

Необходимо импортировать следующие пакеты:

import (
    "context"
    "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"
)

Примечание: В Golang пакет bson используется для представления структуры данных JSON документа. В следующих главах будет подробно рассмотрено представление структур хранения данных MongoDB в 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() {
	// Установить адрес подключения к MongoDB
	uri := "mongodb://root:123456@localhost:27017/admin"
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	// Подключение к MongoDB
	client, err := mongo.Connect(ctx, options.Client().ApplyURI(uri))
	if err != nil {
		panic(err)
	}

	defer func() {
		// Отложенное освобождение соединения
		if err = client.Disconnect(ctx); err != nil {
			panic(err)
		}
	}()

	// Проверка успешного подключения к MongoDB
	if err := client.Ping(ctx, readpref.Primary()); err != nil {
		panic(err)
	}
	fmt.Println("Подключение к MongoDB успешно выполнено!")

	// Получить коллекцию чисел
	collection := client.Database("testing").Collection("numbers")

	// Вставить документ
	res, err := collection.InsertOne(ctx, bson.D{{"name", "pi"}, {"value", 3.14159}})
	id := res.InsertedID
	fmt.Println("Идентификатор нового документа=", id)
}