如何在MongoDB中将字段值设置为对象键?
解决方案
你之前的写法无法生效,是因为MongoDB的$project阶段不支持直接用字段值作为动态键名,必须通过$arrayToObject来实现这个需求。以下是两种符合你需求的聚合管道写法:
1. 每个文档输出为独立的键值对象
这个写法会把每个原始文档转换成你期望的单个键值对结构:
db.collection.aggregate([ { $replaceRoot: { newRoot: { $arrayToObject: [ [ { k: "$type", v: { _id: "$_id", priority: "$priority" } } ] ] } } } ])
逻辑说明:
- 先构造一个包含
k(键名,取自type字段)和v(键值,包含_id和priority)的数组 - 用
$arrayToObject将这个数组转换成目标对象 - 最后用
$replaceRoot把这个对象设为文档的根,得到你想要的结构
2. 将所有文档合并为一个大对象
如果需要把所有结果合并成一个包含所有type键的单一对象,可以用以下管道:
db.collection.aggregate([ { $group: { _id: null, mergedData: { $mergeObjects: { $arrayToObject: [ [ { k: "$type", v: { _id: "$_id", priority: "$priority" } } ] ] } } } }, { $replaceRoot: { newRoot: "$mergedData" } } ])
内容的提问来源于stack exchange,提问作者TheStranger
相关产品推荐
相关产品推荐

