聚合对象数组中的数据

我有以下架构:

{ "_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并输出以下总计。

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

只需提供$group累加器的每个字段。 并使用“double barreled” $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 。 自发布以来,它具有“两个”function:

  1. 采取“数组”的价值观并将它们“汇总”在一起。
  2. $group起作用和“累加器”,从文档中提供“求和”值。

因此,在这里你可以通过将数组“减less”到每个文档的数值,然后通过$group “累计”来使用“两个”函数。

当然, $match在操作链的开头就是“select”。 因为这决定了数据的select,所以你把它放在那里,以及你可以使用“第一”阶段的“索引”。