Запросы к массивам вложенных документов в MongoDB выполняются с использованием специального синтаксиса. Рассмотрим различные примеры.
Структура документа с вложенным массивом
Рассмотрим документ с полем friends, представляющим собой массив объектов. Каждый объект содержит пары ключ-значение: name (имя) и age (возраст). Пример:
{
"friends": [
{ "name": "Laura", "age": 23 },
{ "name": "Mike", "age": 25 },
{ "name": "Steve", "age": 27, "registered": true }
]
}
Примеры запросов
Запрос по одному полю
Для поиска друзей с именем «Laura»:
db.collection.find({ "friends.name": "Laura" })
MongoDB ищет поддокументы в массиве friends, где поле name равно «Laura». Аналогично, поиск по возрасту:
db.collection.find({ "friends.age": 23 })
Или использование диапазона значений:
db.collection.find({ "friends.age": { $gt: 20, $lt: 25 } })
Этот запрос найдет документы, где friends.age находится в диапазоне от 20 до 25 (исключая 20 и 25). $gt означает «больше», $lt — «меньше».
Запрос по точному совпадению объекта
Для поиска точного совпадения объекта:
db.collection.find({ "friends": { "name": "Laura", "age": 23 } })
Этот запрос найдет только документ, содержащий объект {"name": "Laura", "age": 23} в массиве friends. Порядок пар ключ-значение важен.
Запросы с несколькими условиями
Можно задавать несколько условий. Например, поиск друзей по имени «Steve» и возрасту 27:
db.collection.find({ "friends.name": "Steve", "friends.age": 27 })
Условия обрабатываются независимо. Добавление условия friends.registered: true найдет документ, удовлетворяющий всем трем условиям:
db.collection.find({ "friends.name": "Steve", "friends.age": 27, "friends.registered": true })
Оператор $elemMatch
Оператор $elemMatch используется для поиска документов, где все условия выполняются для одного и того же поддокумента в массиве. Например, для поиска друга с именем «Mike» и возрастом 25:
db.collection.find({ "friends": { $elemMatch: { "name": "Mike", "age": 25 } } })
Этот запрос вернет только документы, содержащие объект {"name": "Mike", "age": 25} в массиве friends. В отличие от предыдущих примеров, здесь все условия должны быть выполнены в рамках одного элемента массива.
Практическое применение
(Описание практического применения остается без изменений, так как его удаление приведет к потере важной части статьи)
Рассмотрены способы выполнения запросов к массивам вложенных документов в MongoDB. Использование операторов, таких как $elemMatch, позволяет создавать сложные и гибкие запросы.