带对象的MongoDB Sum数组

时间:2015-11-07 21:57:09

标签: mongodb aggregation-framework

假设我有一个返回以下内容的聚合:

  [
    {driverId: 21312asd12, cars: 2, totalMiles: 30000, family: 4},
    {driverId: 55512a23a2, cars: 3, totalMiles: 55000, family: 2},
    ...
  ] 

如何在groupId的基础上运行每个数据集的总和以返回以下内容?我是否使用$放松?做另一个分组?

例如我想回复:

{ 
  totalDrivers: 2,
  totalCars: 5,
  totalMiles: 85000,
  totalFamily: 6
}

1 个答案:

答案 0 :(得分:1)

您似乎只是将输出中的文档称为"数组",因此只需在管道末尾添加另一个$group

{ "$group": {
    "_id": null,
    "totalDrivers": { "$sum": 1 },
    "totalCars": { "$sum": "$cars" },
    "totalMiles": { "$sum": "$totalMiles" },
    "totalFamily": { "$sum": "$family" }
}}

其中null基本上只是一个空白分组键,而不是要分组的文档中存在的字段。结果应该是单个文档(尽管在数组中,取决于使用的API方法调用或服务器版本)。

或者,如果您实际上是指每个文档都有一个包含这样数组的字段,那么$unwind并按照上述文档或null处理该组:

{ "$unwind": "$someArray" },
{ "$group": {
    "_id": "$_id",
    "totalDrivers": { "$sum": 1 },
    "totalCars": { "$sum": "$someArray.cars" },
    "totalMiles": { "$sum": "$someArray.totalMiles" },
    "totalFamily": { "$sum": "$someArray.family" }
}}

无论如何,在提出这样的问题时,你应该发布你正在使用的代码。很可能你的管道可能没有像你想象的那样有效地达到最终目标,如果你发布它,它既可以清楚地描述你正在做什么,也可以保持开放状态以便进行改进。