假设我有一个返回以下内容的聚合:
[
{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
}
答案 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" }
}}
无论如何,在提出这样的问题时,你应该发布你正在使用的代码。很可能你的管道可能没有像你想象的那样有效地达到最终目标,如果你发布它,它既可以清楚地描述你正在做什么,也可以保持开放状态以便进行改进。