聚合来自对象数组的数据

时间:2017-07-24 09:11:17

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

我有以下架构:

.fa-file-o {
    position: absolute;
    left: 50px;
    top: 15px;
    color: #ffffff
}

<div>
 <span class="fa fa-file-o"></span>
 <input type="button" name="" value="IMPORT FILE"/>
</div>

我想为{ "_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 } ] } 的所有文档聚合“modules”数组中的数据,并输出以下总数。

OrgName = A

1 个答案:

答案 0 :(得分:0)

只需为$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中的行为和“累加器”到文档提供的“总和”值。
  3. 所以在这里你通过将数组“减少”到每个文档的数值来使用“both”函数,然后通过$group“累积”。

    当然$match在操作链的开头就做了“选择”。由于这决定了数据的选择,你把它放在那里,以及你可以使用“第一”阶段的“索引”这一事实。

相关问题