在mongodb聚合项目阶段如何合并两个对象?

Kri*_*Dev 5 mongodb node.js mongodb-query aggregation-framework

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

{ 
  combs:[
    [
      {
        name:"A",
        c_type:"A"
      },
      {
        type:"visual",
        severity:"Normal"
      }
    ],
    [
      {
        name:"B",
        c_type:"B"
      },
      {
        type:"visual",
        severity:"Normal"
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

{ 
  combs:[
    {
      name:"A",
      c_type:"A",
      type:"visual",
      severity:"Normal"
    }
    {
      name:"B",
      c_type:"B",
      type:"visual",
      severity:"Normal"
     }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Nei*_*unn 4

“是否可以不用$unwind操作来实现?”

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

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

因此,实际上,$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"
                }
        ]
}
Run Code Online (Sandbox Code Playgroud)

一般来说,您应该始终优先选择内联处理器(例如$map其他数组运算符)而不是$unwind适用的地方。