Оператор $elemMatch используется для запросов к массивам, содержащим вложенные документы. Он позволяет найти документы, в которых хотя бы один вложенный документ удовлетворяет всем заданным условиям.
Как работает $elemMatch
Оператор $elemMatch ищет документы с массивом, содержащим вложенные документы. Хотя бы один вложенный документ должен соответствовать всем условиям, указанным в фигурных скобках после $elemMatch. Условия разделяются запятыми.
Примеры использования
Пример 1:
Рассмотрим массив friends со вложенными документами. Запрос: { friends: { $elemMatch: { name: "Bob", registered: false } } }
Этот запрос сканирует массив friends. Если найдет документ, где name равно «Bob» и registered равно false, этот документ удовлетворяет запросу.
Пример 2:
Запрос: { friends: { $elemMatch: { registered: false, age: 25 } } }
Вложенные документы массива friends могут содержать дополнительные поля. В этом примере запрос проверяет только registered (равно false) и age (равно 25). Если совпадение найдено, документ удовлетворяет запросу.
Практическое применение
Предположим, есть документ с массивом friends, содержащим три вложенных документа. Примеры запросов с использованием $elemMatch:
{ friends: { $elemMatch: { name: "Laura", age: 23 } } }
Результат: возвращается документ, если существует вложенный документ с name: "Laura" и age: 23.
{ friends: { $elemMatch: { name: "Laura", age: 25 } } }
Результат: совпадений не будет, если name: "Laura" и age: 25 находятся в разных вложенных документах.
{ friends: { $elemMatch: { age: 23, name: "Laura" } } }
Результат: документ удовлетворяет запросу. Порядок условий не важен.
{ friends: { $elemMatch: { age: 23, name: "Laura", registered: true } } }
Результат: документ будет возвращен, если все три условия выполнены в одном вложенном документе. Если registered изменить на false, совпадений не будет.
Оператор $elemMatch — полезный инструмент для поиска конкретных вложенных документов в массивах. Он позволяет эффективно обрабатывать сложные структуры данных.