Расскажите о своем опыте работы с MongoDB в Go.

Ответ

Да, я активно использовал MongoDB в проектах на Go. Основной инструмент — официальный драйвер mongo-go-driver.

Ключевые аспекты работы:

  • Подключение и настройка: Настройка пула соединений через options.Client() для эффективного переиспользования соединений.
  • CRUD-операции: Выполнение стандартных операций: InsertOne, FindOne, Find, UpdateOne, DeleteOne.
  • Работа с BSON: Использование bson.M (неупорядоченная карта) для простых запросов и bson.D (упорядоченный слайс) для случаев, когда важен порядок полей (например, в командах MongoDB). Для работы с данными приложения определял структуры Go с тегами bson.
  • Агрегации: Построение сложных конвейеров агрегации (Aggregation Pipeline) для анализа и обработки данных на стороне БД.
  • Индексы: Создание и управление индексами для оптимизации производительности запросов.
  • Транзакции: Использование транзакций для выполнения нескольких операций как единой атомарной единицы.

Пример кода (подключение и вставка):

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

// ...

client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
    log.Fatal(err)
}

// Проверка соединения
err = client.Ping(context.TODO(), nil)
if err != nil {
    log.Fatal(err)
}

collection := client.Database("testdb").Collection("users")

// Вставка документа
res, err := collection.InsertOne(context.TODO(), bson.M{"name": "Alice", "age": 30})
if err != nil {
    log.Fatal(err)
}
fmt.Printf("Inserted document with ID: %vn", res.InsertedID)

Практические моменты:

  • Обработка ошибок: Важно правильно обрабатывать специфичные ошибки, например, mongo.ErrNoDocuments при поиске.
  • Контекст: Активное использование context.Context для управления таймаутами и отменой запросов.