MongoDB: Запросы к вложенным массивам

Запросы к массивам вложенных документов в 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, позволяет создавать сложные и гибкие запросы.

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