MongoDB mergeObjects总和而不是替换

时间:2019-03-28 14:41:43

标签: mongodb

在聚合的管道阶段,我想调用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},
}

1 个答案:

答案 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"}
} }
]