#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. Большое спасибо большое !