Эта глава вводит в использование запросов к документам MongoDB на Golang.

Предварительные уроки

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

Подготовка тестовых данных

Вставьте пакет данных документов в коллекцию coll.

docs := []interface{}{
    bson.D{
        {"item", "journal"},
        {"qty", 25},
        {"size", bson.D{
            {"h", 14},
            {"w", 21},
            {"uom", "cm"},
        }},
        {"status", "A"},
    },
    // ... (другие данные документа)
}

result, err := coll.InsertMany(context.Background(), docs)

Запрос всех документов

cursor, err := coll.Find(
    context.Background(),
    bson.D{}, // установите пустое условие запроса
)

Условия равенства запроса

Аналогично сопоставлению равенства в SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", "D"}},   // Эквивалентное условие: status = D
)

Оператор запроса in

Аналогично запросу in в SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{{"status", bson.D{{"$in", bson.A{"A", "D"}}}}}) // Эквивалентное условие: status in ('A', 'D')

Условия запроса and

Аналогично логическому выражению and в SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // Эквивалентное условие: status='A' и qty < 30 
        {"status", "A"},
        {"qty", bson.D{{"$lt", 30}}},
    })

Условия запроса or

Аналогично логическому выражению or в SQL.

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // Эквивалентное условие: status = "A" ИЛИ qty < 30
        {"$or", // Используя оператор $or
            bson.A{ // Используя определение типа массива bson.A
                bson.D{{"status", "A"}},
                bson.D{{"qty", bson.D{{"$lt", 30}}}},
            }},
    })

Пример составного запроса

cursor, err := coll.Find(
    context.Background(),
    bson.D{ // Эквивалентное условие: status = "A" И ( qty < 30 ИЛИ item НАЧИНАЕТСЯ С "p%")
        {"status", "A"},
        {"$or", bson.A{
            bson.D{{"qty", bson.D{{"$lt", 30}}}},
            bson.D{{"item", primitive.Regex{Pattern: "^p", Options: ""}}},
        }},
    })

Обход результатов запроса

Пример 1

// Запрос документов, где имя - 'Bob'
cursor, err := coll.Find(context.TODO(), bson.D{{"name", "Bob"}}, opts)
if err != nil {
	log.Fatal(err)
}

// Определите массив документов типа bson.M, где bson.M - структура данных ключ-значение, аналогичная map
var results []bson.M
// Используйте функцию All для получения всех результатов запроса и сохранения результатов в переменной results.
if err = cursor.All(context.TODO(), &results); err != nil {
	log.Fatal(err)
}

// Обойдите массив результатов
for _, result := range results {
	fmt.Println(result)
}

Пояснение: Пример использует тип bson.M для хранения данных документа. Вы можете настроить тип структуры, пока поля совпадают с документом.

Пример 2:

// Определите переменную типа struct для сохранения результата запроса
var result struct {
    Value float64
}

// Определите условие запроса документов name = 'pi'
filter := bson.D{{"name", "pi"}}
// Создайте объект контекста и установите время ожидания запроса в 5 секунд
ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

// Запрос одного элемента данных на основе условия и использование функции Decode для сохранения результата в переменной result
err = collection.FindOne(ctx, filter).Decode(&result)

// Проверьте ошибки запроса
if err == mongo.ErrNoDocuments {
    // Документ не найден
    fmt.Println("Документ не существует")
} else if err != nil {
    log.Fatal(err)
}
// Другая обработка

Совет: Для более сложного синтаксиса запросов MongoDB обратитесь к учебнику по MongoDB.