【问题标题】:mongoose aggregate and sum nested OBJECT (NOT ARRAY ) fieldsmongoose 聚合和求和嵌套的 OBJECT (NOT ARRAY ) 字段
【发布时间】: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' } } }
    ]);

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

提前致谢。

【问题讨论】:

    标签: mongodb mongoose sum aggregate


    【解决方案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:stackoverflow.com/questions/29487351/…
    • 啊!难怪我一直在用$convert$toInt 搜索,每个人都在建议,刚刚检查了提供的沙箱使用的是 mongodb 3.6x >。parseInt 将值更改为 int 然后保存到 db 对吗?所以完全改变了 db 中的类型?
    • MongoDB 似乎在版本之间发生了相当大的变化,所以它可能有点令人沮丧,好吧!没错,代码是覆盖集合中的数据来改变类型。
    猜你喜欢
    • 2017-02-12
    • 1970-01-01
    • 2020-07-16
    • 2015-07-30
    • 1970-01-01
    • 2017-09-13
    • 2016-05-29
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多