MongoDB 对数组中的元素进行分组

Posted

技术标签:

【中文标题】MongoDB 对数组中的元素进行分组【英文标题】:MongoDB group elements in an array 【发布时间】:2020-05-24 17:29:53 【问题描述】:

对于每个 product_id,我想要所有订单中的价格总和以及我想要实现的另一个结果是同一数组中具有相同 id 的产品的价格总和。

\\orders collection:

order_id: 123,
customer_id: 1,
order_items: [product_id:1, price: 2, product: 4, price: 8, product_id:1, price: 2]
,

order_id: 124,
customer_id: 5,
order_items: [product_id:5, price: 7, product: 4, price: 8]

我想要的第一个结果:

product_id: 1, tot_price: 4, 
product_id: 4, tot_price: 16,
product_id: 5, tot_price: 7

第二个结果:

order_id:123,
product_tot: [product_id:1, tot_price: 4, product: 4, tot_price: 8],
order_id:124,
product_tot: [product_id:5, tot_price: 7, product: 4, tot_price: 8,

【问题讨论】:

【参考方案1】:

尝试以下查询:

对于第一个结果:

db.collection.aggregate([
  
    $unwind: 
      path: "$order_items",
      preserveNullAndEmptyArrays: true
    
  ,
  
    $group: 
      _id: "$order_items.product_id",
      tot_price: 
        $sum: "$order_items.price"
      
    
  ,
  
    $project: 
      _id: 0,
      product_id: "$_id",
      tot_price: 1
    
  
])

MongoPlayGroundLink

第二个结果:

db.collection.aggregate([
  
    $unwind: 
      path: "$order_items",
      preserveNullAndEmptyArrays: true
    
  ,
  
    $group: 
      _id: 
        order_id: "$order_id",
        product_id: "$order_items.product_id"
      ,
      tot_price: 
        $sum: "$order_items.price"
      
    
  ,
  
    $project: 
      _id: 0,
      order_id: "$_id.order_id",
      product_id: "$_id.product_id",
      tot_price: "$tot_price"
    
  ,
  
    $group: 
      _id: "$order_id",
      product_tot: 
        $push: 
          product_id: "$product_id",
          tot_price: "$tot_price"
        
      
    
  ,
  
    $project: 
      _id: 0,
      order_id: "$_id",
      product_tot: 1
    
  
])

MongoPlayGroundLink

【讨论】:

感谢您的回答,但它不起作用,它返回,在 0 毫秒内获取 0 条记录 您是否检查了 MongoPlayGroundLink 链接,它在 OP 中按要求工作... 是的,它有效!集合的名称不同。非常感谢!

以上是关于MongoDB 对数组中的元素进行分组的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB按数组中的元素分组

MongoDB计数按数组元素分组的数组中的匹配字符串

MongoDB统计文档(Document)的数组(Array)中的各个元素出现的次数

如何仅获取数组中的元素-mongodb [重复]

如何根据反应中的状态属性对数组中的元素进行分组?

如何对 MongoDB 中数组内的字段值进行分组?