如何用MongoDB聚合管道将文档所有字段包裹到顶层lead对象
问题与解决方案
需求
假设集合中有以下文档:
[ { "_id": 0, "name": "aaaa", "phone": 111 }, { "_id": 1, "name": "bbbb", "phone": 999 } ]
需要编写一条MongoDB聚合管道,将每个文档的所有字段包裹到名为lead的顶层根对象中,且无需硬编码任何字段名,预期输出如下:
[ { "lead": { "_id": 0, "name": "aaaa", "phone": 111 } }, { "lead": { "_id": 1, "name": "bbbb", "phone": 999 } } ]
实现方法
可以利用MongoDB的$$ROOT变量(代表当前完整文档)结合$replaceWith聚合阶段来实现,无需指定具体字段:
db.collection.aggregate([ { $replaceWith: { lead: "$$ROOT" } } ])
如果需要确保顶层不保留原_id字段(和预期输出完全一致),也可以用$project阶段:
db.collection.aggregate([ { $project: { lead: "$$ROOT", _id: 0 } } ])
说明
$$ROOT会引用当前处理的整个文档,将其直接赋值给lead字段后,就自动完成了所有字段的包裹,后续文档新增字段也能自动包含,完全不需要修改聚合管道。
内容的提问来源于stack exchange,提问作者Dürrani
相关产品推荐
相关产品推荐

