Поиск в массиве объектов MongoDB: фильтрация по году и награде

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для осуществления поиска в массиве объектов в MongoDB используйте $elemMatch. Предположим, что в массиве awards у вас находятся объекты с полями type и year, и вам необходимо отыскать все документы, в которых type равен "Nobel", а year соответствует 2021 году.

JS
Скопировать код
db.collection.find({
  awards: {$elemMatch: {type: "Nobel", year: {$eq: 2021}}}
});

Такой запрос вернет только те документы, в которых присутствует объект award с требуемым сочетанием значений type и year.

Кинга Идем в IT: пошаговый план для смены профессии

Эффективные комбинации запросов

В полной мере силу $elemMatch можно ощутить, когда он используется в сочетании с дополнительными операторами запроса:

  • Проекция: Проекция вида { "fieldName.$": 1 } позволяет выбирать только те элементы массива, что удовлетворяют условиям $elemMatch.
  • Множественные условия: Связка $elemMatch и $and предоставляет возможность одновременно применять сразу несколько критериев поиска.
JS
Скопировать код
db.collection.find({
  awards: {$elemMatch: {type: "Nobel", year: 2021}},
  name: "Alice"
}, {
  "awards.$": 1
});

Таким образом, возможно не только отыскать гостей с нужной наградой, но и убедиться, что это действительно нужная вам Алиса.

Мощность $elemMatch

С помощью $elemMatch представляется возможным гибко настраивать поиск по объектам в массивах, которые соответствуют определенным критериям. Сравнивая с поиском иглы в стоге сена, $elemMatch точно покажет, где она находится.

Визуализация

Допустим, у нас имеется коллекция серий телешоу, каждая из которых была награждена:

Markdown
Скопировать код
Телешоу (📺): [
  {
    название: "Кодеры Завтрашнего Дня",
    награды: [
      {type: "Emmy", year: 2021},
      {type: "Golden Globe", year: 2020}
    ]
  },
  { 
    название: "Крестоносцы Клавиатуры",
    награды: [
      {type: "Emmy", year: 2020},
      {type: "Bafta", year: 2021}
    ]
  }
]

Попробуем найти серию, которая получила "Emmy" в 2021 году.

JS
Скопировать код
db.series.find({
  awards: {$elemMatch: {type: "Emmy", year: 2021}}
});

В результате выдачи мы обнаружим именно нужную нам серию:

Markdown
Скопировать код
Победившая Серия (🎯): [
  {
    название: "Кодеры Завтрашнего Дня",
    награды: [
      {type: "Emmy", year: 2021},
      {type: "Golden Globe", year: 2020}
    ]
  }
]

Таким образом, $elemMatch позволяет точно идентифицировать искомый объект в массиве.

Основные использования и увеличение эффективности

$elemMatch открывает дорогу к множеству разных задач запросов в MongoDB, включая:

  • Обработка множественных условий: В случае необходимости, чтобы один объект в массиве покрывал сразу несколько условий, на помощь придет $elemMatch.
  • Поддокументы с массивами полей: Если объект является поддокументом, содержащим массивы, $elemMatch окажет помощь в формулировании оптимизированных запросов.
  • Возвращение соответствующих элементов массива: Выбор нужных элементов массива, которые удовлетворяют запросу, существенно облегчается с помощью $elemMatch.

Что касается увеличения эффективности запросов, здесь следует учесть:

  • Индексацию: Индексы значительно ускоряют выполнение запросов.
  • Сокращение объема данных: Старайтесь ограничивать количество возвращаемых данных путем использования проекций.
  • Читабельность кода: Вместе с операторами вроде $and, $elemMatch придает запросам гибкость, в то же время сохраняя их ясность и читалимость.

Полезные материалы

  1. Query Documents — MongoDB Manual — Информация по запросам к документам в MongoDB.
  2. $elemMatch (query) — MongoDB Manual — Более подробное описание работы оператора $elemMatch.
  3. Mongoose ODM v8.1.2 — ORM-библиотека для Node.js, приходящая на помощь при работе с моделями в MongoDB.
  4. Array – JavaScript | MDN — Руководство по использованию массивов JavaScript.
  5. Text Search — MongoDB Manual — Как осуществлять текстовый поиск в MongoDB.
Свежие материалы