MongoDB $and: Объединение условий в запросах

Оператор $and в MongoDB комбинирует несколько условий. Запрос возвращает только документы, удовлетворяющие всем условиям. $and принимает массив условий, разделенных запятыми, каждое условие заключено в фигурные скобки.

Примеры использования

Пример 1: Поиск мужчин 25 лет

Запрос:

{
  "$and": [
    { "gender": "male" },
    { "age": 25 }
  ]
}

Оба условия заключены в фигурные скобки и разделены запятой внутри массива, переданного оператору $and.

Пример 2: Поиск людей в возрасте от 20 до 24 и от 26 лет и старше

Этот запрос находит лиц, чей возраст >= 20 и != 25:

{
  "$and": [
    { "age": { "$gte": 20 } },
    { "age": { "$ne": 25 } }
  ]
}

При запросе по одному полю или с использованием одного оператора, необходим явный оператор $and.

Явный и неявный $and

Рассмотрим два запроса с двумя условиями к полю age:

Запрос 1 (явный $and):

db.collection.find({ "$and": [{ "age": { "$gte": 20 } }, { "age": { "$ne": 25 } }] })

Запрос 2 (неявный $and):

db.collection.find({ "age": { "$gte": 20 }, "age": { "$ne": 25 } })

Результаты могут отличаться. В запросе 2 второе условие переписывает первое.

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

Найдем всех женщин, чей любимый фрукт – банан:

Запрос с явным $and:

db.collection.find({
  "$and": [
    { "gender": "female" },
    { "favoriteFruit": "banana" }
  ]
})

Количество результатов: db.collection.countDocuments({ "$and": [{ "gender": "female" }, { "favoriteFruit": "banana" }] })

Аналогичный результат с неявным $and:

db.collection.find({ "gender": "female", "favoriteFruit": "banana" })

Здесь явный и неявный $and дают одинаковый результат, поскольку запрос к разным полям.

Запросы по одному полю

Рассмотрим запрос по полю age с явным $and:

db.collection.find({
  "$and": [
    { "age": { "$ne": 25 } },
    { "age": { "$gte": 25 } }
  ]
}).sort({ age: 1 })

Запрос вернет документы, где age >= 26.

Заменим явный $and на неявный:

db.collection.find({ "age": { "$ne": 25 }, "age": { "$gte": 25 } }).sort({ age: 1 })

Результат изменится: запрос вернет документы с age >= 25, так как первое условие переписывается вторым. Перестановка условий также изменит результат.

Вывод: При запросе по полям с одинаковыми именами используйте явный оператор $and. Неявный $and в этом случае некорректен.

Что будем искать? Например,программа