MongoDB 聚合 $lookup 不适用于 $group
Posted
技术标签:
【中文标题】MongoDB 聚合 $lookup 不适用于 $group【英文标题】:MongoDB aggregate $lookup not working with $group 【发布时间】:2021-11-20 22:54:48 【问题描述】:我的数据库中有两个集合:类别和产品,我想列出它们所有的所有类别和产品数量。在产品架构内部,我有指向类别集合中 _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"
【讨论】:
谢谢你这工作!你能解释一下为什么在这种情况下不需要 $group 吗?$group
用于合并来自多个文档的数据,在您的情况下,您需要的所有数据都在 1 个文档中,并且您已经将它们放在 1 个数组中。如果您在集合中有这两个文档(不在数组中),您会像在查询中那样做。 $group
在集合级别上工作,如果我们只需要在 1 个文档中,我们通常不需要它。
非常感谢!以上是关于MongoDB 聚合 $lookup 不适用于 $group的主要内容,如果未能解决你的问题,请参考以下文章
mongodb排序规则不适用于facet阶段的insinde聚合