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匹配聚合不适用于日期

mongodb排序规则不适用于facet阶段的insinde聚合

MongoDb:聚合 $lookup

MongoDB 聚合 - $lookup 性能

Mongodb 聚合 $lookup 和 group 非常非常慢

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`