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
相关产品推荐
相关产品推荐

