Поиск в массиве объектов MongoDB: фильтрация по году и награде
Быстрый ответ
Для осуществления поиска в массиве объектов в MongoDB используйте $elemMatch. Предположим, что в массиве awards у вас находятся объекты с полями type и year, и вам необходимо отыскать все документы, в которых type равен "Nobel", а year соответствует 2021 году.
db.collection.find({
awards: {$elemMatch: {type: "Nobel", year: {$eq: 2021}}}
});
Такой запрос вернет только те документы, в которых присутствует объект award с требуемым сочетанием значений type и year.

Эффективные комбинации запросов
В полной мере силу $elemMatch можно ощутить, когда он используется в сочетании с дополнительными операторами запроса:
- Проекция: Проекция вида
{ "fieldName.$": 1 }позволяет выбирать только те элементы массива, что удовлетворяют условиям$elemMatch. - Множественные условия: Связка
$elemMatchи$andпредоставляет возможность одновременно применять сразу несколько критериев поиска.
db.collection.find({
awards: {$elemMatch: {type: "Nobel", year: 2021}},
name: "Alice"
}, {
"awards.$": 1
});
Таким образом, возможно не только отыскать гостей с нужной наградой, но и убедиться, что это действительно нужная вам Алиса.
Мощность
С помощью $elemMatch представляется возможным гибко настраивать поиск по объектам в массивах, которые соответствуют определенным критериям. Сравнивая с поиском иглы в стоге сена, $elemMatch точно покажет, где она находится.
Визуализация
Допустим, у нас имеется коллекция серий телешоу, каждая из которых была награждена:
Телешоу (📺): [
{
название: "Кодеры Завтрашнего Дня",
награды: [
{type: "Emmy", year: 2021},
{type: "Golden Globe", year: 2020}
]
},
{
название: "Крестоносцы Клавиатуры",
награды: [
{type: "Emmy", year: 2020},
{type: "Bafta", year: 2021}
]
}
]
Попробуем найти серию, которая получила "Emmy" в 2021 году.
db.series.find({
awards: {$elemMatch: {type: "Emmy", year: 2021}}
});
В результате выдачи мы обнаружим именно нужную нам серию:
Победившая Серия (🎯): [
{
название: "Кодеры Завтрашнего Дня",
награды: [
{type: "Emmy", year: 2021},
{type: "Golden Globe", year: 2020}
]
}
]
Таким образом, $elemMatch позволяет точно идентифицировать искомый объект в массиве.
Основные использования и увеличение эффективности
$elemMatch открывает дорогу к множеству разных задач запросов в MongoDB, включая:
- Обработка множественных условий: В случае необходимости, чтобы один объект в массиве покрывал сразу несколько условий, на помощь придет
$elemMatch. - Поддокументы с массивами полей: Если объект является поддокументом, содержащим массивы,
$elemMatchокажет помощь в формулировании оптимизированных запросов. - Возвращение соответствующих элементов массива: Выбор нужных элементов массива, которые удовлетворяют запросу, существенно облегчается с помощью
$elemMatch.
Что касается увеличения эффективности запросов, здесь следует учесть:
- Индексацию: Индексы значительно ускоряют выполнение запросов.
- Сокращение объема данных: Старайтесь ограничивать количество возвращаемых данных путем использования проекций.
- Читабельность кода: Вместе с операторами вроде
$and,$elemMatchпридает запросам гибкость, в то же время сохраняя их ясность и читалимость.
Полезные материалы
- Query Documents — MongoDB Manual — Информация по запросам к документам в MongoDB.
- $elemMatch (query) — MongoDB Manual — Более подробное описание работы оператора $elemMatch.
- Mongoose ODM v8.1.2 — ORM-библиотека для Node.js, приходящая на помощь при работе с моделями в MongoDB.
- Array – JavaScript | MDN — Руководство по использованию массивов JavaScript.
- Text Search — MongoDB Manual — Как осуществлять текстовый поиск в MongoDB.


