使用基于对象键的键将对象数组转换为对象?

时间:2019-12-10 14:38:28

标签: mongodb aggregation-framework

例如,在我的Mongo Aggregate请求中,我得到了由两个对象组成的数组:

[
  {
    "key": "first",
    "meta": 123,
  },
  {
    "key": "second",
    "meta": 567,
    "maybeonmorefield": 789
  }
]

是否可以仅使用Mongo聚合框架将该数组转换为以下对象:

{
  "first": {
    "meta": 123,
  },
  "second": {
    "meta": 123,
    "maybeonmorefield": 789
  }
}

如您所见,键实际上是第一个示例中对象的key字段值。

感谢任何提示:)

1 个答案:

答案 0 :(得分:1)

您可以使用$replaceRoot在根级别重新排列文档,并使用$arrayToObject动态地构建新密钥:

db.collection.aggregate([
    {
        $addFields: {
            "root": "$$ROOT"
        }
    },
    {
        $project: {
            "root.key": 0,
            "root._id": 0
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: [[ { k: "$key", v: "$root" } ]]
            }            
        }
    }
])

Mongo Playground