如何在MongoDB Python中将文档值作为结果的键返回?
解决MongoDB聚合中动态键的生成问题
要实现将class_id的值作为结果键、scores.type作为对应值的输出格式,你需要利用MongoDB的动态键构造能力——常规$project只能指定固定键名,无法直接将字段值作为键。具体聚合步骤如下:
完整聚合查询(Python驱动写法)
list(db.student.aggregate([ # 拆分scores数组,每个数组元素生成独立文档 {"$unwind": "$scores"}, # 构造{class_id值: type值}的对象,将class_id转为字符串作为键 {"$project": { "_id": 0, "result": {"$arrayToObject": [[{"k": {"$toString": "$class_id"}, "v": "$scores.type"}]]} }}, # 将构造的对象作为根文档输出 {"$replaceRoot": {"newRoot": "$result"}} ]))
各步骤说明
$unwind阶段:把每个文档中的scores数组拆分为多个独立文档,每个文档对应一个scores元素,确保每个type都能和class_id一一对应。$project阶段:- 使用
$toString将数字类型的class_id转为字符串(MongoDB对象的键必须是字符串类型); - 通过
$arrayToObject将包含键值对的数组[{k: class_id字符串, v: type值}]转换为目标对象;
- 使用
$replaceRoot阶段:将构造好的result对象作为根文档,直接输出{"2": "exam"}这类格式的文档,匹配你的期望输出。
原查询不生效的原因
你之前的$project写法{"class_id":1,"type":2,"_id":0}是指定固定键名(class_id和type),而非将class_id的字段值作为键名,因此得到的是包含固定键的文档,而非动态键格式。
内容的提问来源于stack exchange,提问作者geethuth
相关产品推荐
相关产品推荐

