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

时间:2019-09-23 05:23:49

标签: node.js mongodb mongodb-query aggregation-framework

我的聚合管道中具有以下结构数组。尝试过合并对象和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"
     }
  ]
}

2 个答案:

答案 0 :(得分:4)

  

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

是的。只要您以这种方式一致地映射 arrays 的结构,那么您实际上只需要管道中的一个阶段:

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或其他数组运算符。

答案 1 :(得分:0)

您可以使用此聚合查询

db.collection.aggregate([
     { $unwind: "$combs" },
     { $addFields: { combs: { $mergeObjects: "$combs" }}},
     { $group: { _id: "$_id", combs: { $push: "$combs" }} }
 ])