You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB能否将字段值作为查询结果键名?如何实现?

如何在MongoDB查询结果中将字段值作为键名?

当然可以实现这个需求!MongoDB的普通find()查询没法直接把字段值转成键名,但借助聚合管道就能轻松搞定。针对你给出的文档结构,这里有两种实用的实现方式:

方法一:分步转换(逻辑清晰易理解)

这个方法分阶段处理,适合新手理清转换逻辑:

db.yourCollection.aggregate([
  // 第一步:构造键值对数组
  {
    $project: {
      _id: 0, // 不需要默认_id的话可以去掉
      keyValuePair: [{ k: "$code", v: "$item" }]
    }
  },
  // 第二步:把数组转成对象,并替换为根文档
  {
    $replaceRoot: {
      newRoot: { $arrayToObject: "$keyValuePair" }
    }
  }
])

步骤说明:

  • $project阶段:把每个文档的code值设为键名(对应k字段),item值设为对应的值(对应v字段),打包成一个数组。此时文档结构会变成{ keyValuePair: [{ k: "xxx", v: "yyy" }] }。
  • $replaceRoot阶段:先用$arrayToObject将上述数组转换成{ "xxx": "yyy" }格式的对象,再通过$replaceRoot把这个对象作为输出的根文档,最终得到你期望的结果。

方法二:简洁版(一步到位)

如果追求代码紧凑,可以直接在$replaceRoot里完成所有转换:

db.yourCollection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [[{ k: "$code", v: "$item" }]]
      }
    }
  },
  // 可选:移除_id字段(如果你的文档包含_id且不需要输出)
  { $project: { _id: 0 } }
])

注意事项:

  • 这两种方法都要求MongoDB版本在3.4及以上,因为$arrayToObject是3.4版本新增的聚合操作符。
  • 如果需要转换多个字段,只需要在数组中添加更多{ k: "$字段名", v: "$对应值字段" }的对象即可。

内容的提问来源于stack exchange,提问作者Čamo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:16:16