вторник, 16 июня 2020 г.

Работа с MongoDB в Golang

MongoDB поддерживает драйвер для Go - go.mongodb.org/mongo-driver.

Требования

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

Установка

Рекомендуемый способ начать использовать драйвер MongoDB Go - использовать модули go для установки зависимости в вашем проекте. Это можно сделать, либо импортировав пакеты с go.mongodb.org/mongo-driver и выполнив шаг сборки, чтобы установить зависимость, либо явно запустив

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

При использовании версии Go, которая не поддерживает модули, драйвер можно установить с помощью команды dep, запустив

dep ensure -add "go.mongodb.org/mongo-driver/mongo"

Использование

Чтобы начать работу с драйвером, импортируйте пакет mongo, создайте mongo.Client:

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

client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))

И подключите его к вашему работающему серверу MongoDB:

ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = client.Connect(ctx)

Чтобы сделать это за один шаг, вы можете использовать функцию Connect:

ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))

Вызов Connect не блокирует обнаружение сервера. Если вы хотите узнать, был ли сервер MongoDB найден и подключен, используйте метод Ping:

ctx, _ = context.WithTimeout(context.Background(), 2*time.Second)
err = client.Ping(ctx, readpref.Primary())

Чтобы вставить документ в коллекцию, сначала получите базу данных, а затем экземпляр коллекции с клиента:

collection := client.Database("testing").Collection("numbers")

Затем экземпляр Collection можно использовать для вставки документов:

ctx, _ = context.WithTimeout(context.Background(), 5*time.Second)
res, err := collection.InsertOne(ctx, bson.M{"name": "pi", "value": 3.14159})
id := res.InsertedID

Несколько методов запроса возвращают курсор, который можно использовать так:

ctx, _ = context.WithTimeout(context.Background(), 30*time.Second)
cur, err := collection.Find(ctx, bson.D{})
if err != nil { log.Fatal(err) }
defer cur.Close(ctx)
for cur.Next(ctx) {
    var result bson.M
    err := cur.Decode(&result)
    if err != nil { log.Fatal(err) }
    // сделать что-то с результатом....
}
if err := cur.Err(); err != nil {
    log.Fatal(err)
}

Для методов, которые возвращают один элемент, возвращается экземпляр SingleResult:

var result struct {
    Value float64
}
filter := bson.M{"name": "pi"}
ctx, _ = context.WithTimeout(context.Background(), 5*time.Second)
err = collection.FindOne(ctx, filter).Decode(&result)
if err != nil {
    log.Fatal(err)
}
// Делаем что-то с результатом...


Читайте также:


Комментариев нет:

Отправить комментарий