在聚合的管道阶段,我想调用mergeObjects添加字段而不是替换字段。
在管道阶段,我的文档如下:
3
我想通过_id对所有这些文档进行分组(并且所有文档的_id总是相同),并得到以下文档作为结果:
{[
{_id: 'A', fruits: {banana: 2, apple: 1}},
{_id: 'A', fruits: {banana: 1, pineapple: 3},
{_id: 'A', fruits: {melon: 1, pineapple: 3, guava: 2}
]}
我正在尝试通过使用mergeObjects实现此目的,但这只是将重复项的值替换为数组中找到的最后一项,而我最终得到的是这样的东西:
{
_id: 'A',
fruits: {banana: 3, apple: 1, pineapple: 6, melon: 1, guava: 2},
}
答案 0 :(得分:3)
您可以将对象转换为数组,展开,按字段分组并转换回对象:
[
... previous stages ...,
{ $addFields: {
fruit: {$objectToArray: "$fruits"}
} },
{ $unwind: "$fruit"},
{ $group: {
_id: {
id: "$_id",
k: "$fruit.k"
},
v: {$sum: "$fruit.v"}
} },
{ $group: {
_id: "$_id.id",
fruits: { $push: {k: "$_id.k", v: "$v"}}
} },
{ $project: {
fruits: {$arrayToObject: "$fruits"}
} }
]