Есть ли способ сделать один запрос в MongoDB для разных типов документов и ограничить каждый тип определенным числом в одной коллекции?

#javascript #node.js #mongodb

Вопрос:

Допустим, у меня есть коллекция под названием «домашние животные».

Коллекция содержит три различных типа домашних животных: кошки, собаки и птицы

Теперь предположим, что в коллекции 10 кошек, 10 собак и 10 птиц (всего 30 документов).

Есть ли способ сделать один запрос к домашним животным, который даст мне 3 кошки, 2 собаки и 1 птицу?

В принципе, я хочу указать каждый тип питомца, которого я хочу, и ограничить каждый тип питомца определенным числом, и все это в одном запросе. Причина этого в том, что я хочу быть эффективным и не делать много запросов.

Это то, что у меня есть в настоящее время:

   const docs = await db.collection('pets');

  const cats = await docs
  .find({ type: 'cat' })
  .limit(3)
  .toArray();

  const dogs = await docs
  .find({ type: 'dog' })
  .limit(2)
  .toArray();

  const birds = await docs
  .find({ type: 'bird' })
  .limit(1)
  .toArray();
 

Любая помощь будет очень признательна 🙂

Комментарии:

1. Вы можете использовать агрегированный запрос. Использование этапа $facet дает вам решение с одним запросом.

2. Спасибо! Это именно то, что мне было нужно

Ответ №1:

Благодаря prasad_, вот решение, которое решает мой случай:

   const docs = await db.collection('pets')
  .aggregate([
    {
      $facet: {
        'cats': [
          { $match: { type: 'cat' } },
          { $limit: 3 },
        ],
        'dogs': [
          { $match: { type: 'dog' } },
          { $limit: 2 },
        ],
        'birds': [
          { $match: { type: 'bird' } },
          { $limit: 1 },
        ],
      },
    },
  ])
  .toArray();