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