Оператор $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 в этом случае некорректен.