MongoDB агрегатный поиск $не работает с $group

#mongodb #mongoose #nosql

Вопрос:

У меня в базе данных есть две коллекции: категории и продукты, и я хочу перечислить все категории и количество продуктов, которые у них есть. Внутри схемы продуктов у меня есть «внешний ключ», который указывает на столбец _id в коллекции категорий, поэтому я сформировал такой запрос :

 db.categories.aggregate(
  {
    $lookup:{
        from:"products",
        localField:"_id",
        foreignField:"product_category",
        as:"category_products"
     }
   }
)
 

и я получаю это в результате:

 { _id: ObjectId("613cde06e806c050fcf073eb"),
  name: 'Drinks',
  category_products: 
   [{ _id: ObjectId("61476348e4dfdb0d54d38a29"),
       product_name: 'Alpro Almond Miln',
       product_price: 1.99,
       product_category: ObjectId("613cde06e806c050fcf073eb"),
       createdAt: 2021-09-19T16:20:24.269Z,
       updatedAt: 2021-09-19T16:20:24.269Z,
       __v: 0 },
     { _id: ObjectId("6147a974e4dfdb0d54d38aee"),
       product_name: 'Coca Cola 2l',
       product_price: 1.99,
       product_category: ObjectId("613cde06e806c050fcf073eb"),
       createdAt: 2021-09-19T21:19:48.105Z,
       updatedAt: 2021-09-19T21:19:48.105Z,
       __v: 0 }]}
 

а теперь я хочу подсчитать количество продуктов, которые есть в этой категории под названием «Напитки». Я формирую такой запрос :

   db.categories.aggregate(
  {
    $lookup:{
        from:"products",
        localField:"_id",
        foreignField:"product_category",
        as:"category_products"
     }
   },   
    {
     $group : {
         _id : '$name',
         num_of_products : {
          $sum : "$category_products._id" 
        } 
      }
    }
)
 

И в результате я получаю :

 { _id: 'Drinks', num_of_products: 0 }
 

Поэтому мой вопрос заключается в том, как правильно рассчитать количество товаров в каждой категории в коллекции. Я ожидаю получить такой результат :

 { _id: 'Sweets', num_of_products: 2 }
{ _id: 'Snacks', num_of_products: 5 }
{ _id: 'Drinks', num_of_products: 1 }
{ _id: 'Coffee', num_of_products: 6 }
 

Ответ №1:

Похоже , вам это не нужно $group , у вас есть категория продуктов в массиве, поэтому $size достаточно взглянуть на ее внешний вид.

Попробуйте добавить $project это в качестве следующего этапа.

*я не уверен,хотите ли вы этого,потому что в ваших данных выборки нет сладостей, закусок, только напитки с кофе, а у вас есть 2 напитка, и это показывает, что вы ожидаете только 1 напиток

  {
  "$project" : {
    "_id" : 0,
    "name" : "$name",
    "num_of_products" : {
      "$size" : "$category_products"
    }
  }
}
 

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

1. Спасибо, что это работает ! Можете ли вы просто объяснить мне, почему $group не понадобилась в этом случае ?

2. $group используется, когда вы хотите объединить данные из нескольких документов, в вашем случае все ваши данные, которые вам нужны, были в 1 документе, и они уже были у вас в 1 массиве. В случае, если бы у вас были эти 2 документа в коллекции (не в массиве), вы бы сделали это так, как в вашем запросе. $group работает на уровне коллекции, если все, что нам нужно, находится внутри 1 документа, он нам вообще не нужен.

3. Большое спасибо большое !