首页 > 解决方案 > 如何在mongodb聚合项目阶段合并两个对象?

问题描述

我的聚合管道中有以下结构数组。尝试合并对象和 setUnion 运算符。

{ 
  combs:[
    [
      {
        name:"A",
        c_type:"A"
      },
      {
        type:"visual",
        severity:"Normal"
      }
    ],
    [
      {
        name:"B",
        c_type:"B"
      },
      {
        type:"visual",
        severity:"Normal"
      }
    ]
  ]
}

我期待以下结果产生一些统计数据。请帮我。

{ 
  combs:[
    {
      name:"A",
      c_type:"A",
      type:"visual",
      severity:"Normal"
    }
    {
      name:"B",
      c_type:"B",
      type:"visual",
      severity:"Normal"
     }
  ]
}

标签: node.jsmongodbmongodb-queryaggregation-framework

解决方案


“没有$unwind操作可以实现吗?”

嗯,是。只要您的数组数组结构始终以这种方式映射,那么您实际上只需要管道中的一个阶段:

db.collection.aggregate([
  { "$addFields": {
     "combs": {
       "$map": {
         "input": "$combs",
         "in": { "$mergeObjects": "$$this" }
       }
     }
  }}
])

所以实际上,$map操作符在这里是一种比$unwind处理每个数组元素更有效的方法。此外,由于$mergeObjects期待“对象数组”,这就是数组数组的每个元素实际上是什么。所以简单地在数组的{ "$mergeObjects": "$$this" }每个外部成员上。

根据您提供的数据生成输出:

{
        "_id" : ObjectId("5d8865c273375a6a4cc9e76a"),
        "combs" : [
                {
                        "name" : "A",
                        "c_type" : "A",
                        "type" : "visual",
                        "severity" : "Normal"
                },
                {
                        "name" : "B",
                        "c_type" : "B",
                        "type" : "visual",
                        "severity" : "Normal"
                }
        ]
}

通常,您应该始终更喜欢内联处理器$map或其他数组运算符,而不是$unwind适用的地方。


推荐阅读