mongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段

Posted

技术标签:

【中文标题】mongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段【英文标题】:mongoose aggregate and sum nested OBJECT (NOT ARRAY ) fields 【发布时间】:2020-01-27 02:36:00 【问题描述】:

我看到很多帖子使用aggregatesum 嵌套ARRAY 字段,我尝试将它与我的嵌套对象一起使用,但它不起作用。

当我查询时,数据结构类似于...

[
        
            "key": "value",
            "more_key": "more_value",
            "meals": 
                "A": 
                    "name": "salmon",
                    "amount": "8"
                ,
                "B": 
                    "name": "vege",
                    "amount": "6"
                ,
            
        ,
        
            "key": "value",
            "more_key": "more_value",
            "meals": 
                "A": 
                    "name": "salmon",
                    "amount": "8"
                ,
                "B": 
                    "name": "vege",
                    "amount": "6"
                ,
                "C": 
                    "name": "other meal",
                    "amount": "6"
                ,
            
        ,
    ];

我正在尝试总结amount

我已经尝试过这样的事情......

await Model.aggregate([
         $match:  isDeleted: false  ,
         $unwind: '$meals' ,  // tried with + without this
         $group:  _id: null, sum:  $sumA: '$meals.A.amount', $sumB: '$meals.B.amount'   
    ]);

有人可以给我一些关于如何做到这一点的建议和建议吗?

提前致谢。

【问题讨论】:

【参考方案1】:

这里发生了一些事情:

1) $unwind 不适用于对象,仅适用于数组。您可以通过使用 $objectToArray 将餐点对象转换为数组来解决此问题

2)您的金额字段看起来像是字符串类型,因此需要将其转换为数字以进行求和

这是一个满足您需要的聚合:

await Model.aggregate([
  // Convert meals object to array
   $project:  meals:  $objectToArray: '$meals' ,

  //  unwind meals array
   $unwind:  '$meals' ,

  // convert meals.v.amount to integer and sum them (the v is shorthand for values)
   $group:  
    _id: null, 
    total: 
      $sum:  
        $convert: 
          input: '$meals.v.amount',
          to: 'int'
        
      
    
  
])

您可以将 $group 的 _id 更改为 _id: meals.k 以通过餐点对象的键进行求和,即 A、B、C

【讨论】:

我想 $unwind: '$meals' , 的意思是 $unwind: '$meals', 对吧?但我收到UnhandledPromiseRejectionWarning: MongoError: Unrecognized expression '$convert' 的错误消息 $convert 是 MongoDB 4.0 版中的新功能,但它已经发布了一年左右。你用的是什么版本? 如果由于某种原因无法更新到 4.x 版本,请参阅这篇文章了解如何在早期版本中将字符串转换为 int:***.com/questions/29487351/… 啊!难怪我一直在用$convert$toInt 搜索,每个人都在建议,刚刚检查了提供的沙箱使用的是 mongodb 3.6x >。parseInt 将值更改为 int 然后保存到 db 对吗?所以完全改变了 db 中的类型? MongoDB 似乎在版本之间发生了相当大的变化,所以它可能有点令人沮丧,好吧!没错,代码是覆盖集合中的数据来改变类型。

以上是关于mongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

如何从 1 分钟的嵌套数组数据中聚合 OHLC 5 分钟(mongodb、mongoose)

mongoDB,带有 $sum 和 $count 的 mongoose 聚合查询

mongoDB,带有 $sum 和 $count 的 mongoose 聚合查询

MongoDB聚合和分组嵌套字段

查询 $match 和 $project 重嵌套数据(MongoDB/聚合)