Этот учебник представляет основные операции MongoDB с точки зрения языка Golang.
Примечание: В этом учебнике используется официальный пакет драйвера языка Go, предоставленный 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)
}