【问题标题】:Aggregate data from array of objects从对象数组聚合数据
【发布时间】:2017-12-29 19:13:28
【问题描述】:

我有以下架构:

{  "_id": {
    "$oid": "58c0204d9f10810115f13e5d"
    },"OrgName": "A",
     "modules": [
    {
        "name": "test",
        "fullName": "john smith",

        "_id": {
            "$oid": "58c0204d9f10810115f13e5e"
        },
        "TimeSavedPlanning": 520,
        "TimeSavedWorking": 1000,
        "costSaved": 0
    },
    {
        "name": "test1",
        "fullName": "john smith",

        "_id": {
            "$oid": "58c020f85437c22215be92cc"
        },
        "TimeSavedPlanning": 0,
        "TimeSavedWorking": 1000,
        "costSaved": 500
    }
]
}

我想为OrgName = A 所在的所有文档聚合 "modules" 数组中的数据并输出以下总数。

TimeSavedPlanning = 520 (because 520 + 0 = 520)
TimeSavedWorking = 2000 (because 1000 + 1000 = 2000)
costSaved = 500 (because 0 + 500)

【问题讨论】:

  • 您认为提供的答案中是否有某些内容无法解决您的问题?如果是这样,那么请对答案发表评论,以明确需要解决哪些尚未解决的问题。如果它确实回答了您提出的问题,请注意Accept your Answers您提出的问题

标签: javascript node.js mongodb mongoose aggregation-framework


【解决方案1】:

只需为$group 累加器提供每个字段。并使用“双桶”$sum 从数组和文档中“求和”:

Model.aggregate([
  { "$match": { "OrgName": "A" } },
  { "$group": {
    "_id": null,
    "TimeSavedPlanning": { "$sum": { "$sum":"$modules.TimeSavedPlanning" } },
    "TimeSavedWorking": { "$sum": { "$sum": "$modules.TimeSavedWorking" } },
    "costSaved": { "$sum": { "$sum": { "$modules.costSaved" } }
  }}
])

自 MongoDB 3.2 起,您已被允许像这样使用 $sum。自该版本以来,它具有“两个”功能:

  1. 获取值的“数组”并将它们“求和”在一起。
  2. $group 中的“累加器”和“累加器”对文档提供的值进行“求和”。

因此,在这里您通过将数组“减少”为每个文档的数值,然后通过$group“累积”来使用“两个”函数。

当然,$match 会在操作链的开头进行“选择”。因为这决定了数据的选择,并且您为此目的将其放在那里,以及您可以使用“第一”阶段的“索引”这一事实。

【讨论】:

  • 感谢您的回答。我现在将对其进行测试并做出相应的回应。不过只有一个问题,我做了一些研究,发现了$unwind。某些消息来源建议使用$unwind 来展开该数组。你觉得这样好吗?
  • @Skywalker 天哪,不! $unwind 应避免使用,除非您绝对需要使用它。它真正应该在现代版本中使用的唯一一次是数组中的“值”需要构成“分组键”本身的一部分。现代版本配备了很好的运算符,在大多数情况下无需使用$unwind。仅用作“最后的手段”。
  • 再次感谢。抱歉问了这么多问题。您能否解释一下“数组中的“值”需要构成“分组键”本身的一部分”是什么意思?我只是想确保我完全理解。再次感谢!
  • @Skywalker 如果你有关于使用$unwind 的“另一个问题”,那么Ask a new Question。我正在回答您在上面实际提出的问题。这就是你如何得到你的总和。这就是你如何“以最有效的方式”做到这一点。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多