将2个对象分组为1个对象并合并键

时间:2017-12-14 14:27:22

标签: mongodb aggregation-framework

我正在尝试将MongoDB文档中的2个对象组合成一个合并了键的对象。我所拥有的是:

{
  "_id": ObjectId("..."),
  "object_a": { "keyA": 1, "keyB": "valueB" }
  "object_b": { "keyC": 2 }
}

我试图得到以下内容:

{
  "_id": ObjectId("..."),
  "object_a": { "keyA": 1, "keyB": "valueB", "keyC": 2 }
}
  • 我可以断言没有关键冲突
  • 我事先不知道关键名称

我尝试使用$addFields运算符,但这会将object_b嵌套在object_a内,而不是合并键。

{
  "$addFields":
  {
    "object_a": "$object_b"
  }
}

换句话说,我正在寻找一个$setUnion但是对象。

2 个答案:

答案 0 :(得分:3)

您可以在3.6中使用$mergeObjects

{"$addFields":{"object_a": {"$mergeObjects": ["$object_a", "$object_b"]}}} 

对于3.4,您可以使用$arrayToObject$objectToArray来合并密钥。

{"$addFields":{"object_a": { "$arrayToObject": {"$setUnion": [{"$objectToArray": "$object_a"},{"$objectToArray": "$object_b"}]}}}}

答案 1 :(得分:0)

这是Mongo 3.4.4+的改进版本,可处理空值。它基于@Veeram提供的解决方案

function $mergeObjects(...items) {
  return {
    $arrayToObject: {
      $setUnion: items.map(_ => (
        {$filter: {input: {$objectToArray: _}, cond: {$ne: ["$$this.v", null]}}}
      ))
    }
  }
}