Ответ
Да, я активно использовал 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для управления таймаутами и отменой запросов.