首页 > 解决方案 > 使用 Compass 的 Mongo DB 聚合 - 使用变量作为键名

问题描述

我正在尝试将一组对象映射到一个新的对象数组。数组中的对象示例:

{
   k:"Zip code"
   v:{
      questionId:"596080353"
      question:"In which ZIP code do you currently reside?"
      answer:"97213"
   }
}

我希望最终的对象是:

{
  "Zip code": "97213"
}

我无法将 k 设置为新对象中的键名。有谁知道如何在 mongo 聚合中使用变量作为键名?

标签: mongodbmongodb-queryaggregation-frameworkmongodb-compass

解决方案


使用$arrayToObject

将数组转换为单个文档;数组必须是:

以以下格式塑造您的数据

[ { "k": "Zip code", "v": "97213"}, { "k": "Zip code", "v": 97212 } ]

示例 1 - https://mongoplayground.net/p/AXKHsZf-Qzy

db.collection.aggregate([
  { $set: { doc: [ { k: "$k",  v: "$v.answer" } ] } },
  { $set: { doc: { "$arrayToObject": "$doc" } } }
])

示例 2 - https://mongoplayground.net/p/Vm1DwHVb9KY

db.collection.aggregate([ 
  { $unwind: "$zip" }, 
  { $addFields: { doc: { $arrayToObject: [ [ { k: "$zip.k", v: "$zip.v" } ] ] } } },
  { $group: { _id: "$_id", zips: { $push: "$doc" } } }
])

推荐阅读