如何通过MongoDB聚合从多文档提取合并嵌套段落对象列表
MongoDB聚合:提取并合并所有嵌套paragraph文档
原始集合数据
[ { "_id": "doc1", "content": [ { "paragraph": "lorem" }, { "paragraph": "lorem ipsum" } ] }, { "_id": "doc2", "content": [ { "paragraph": "lorem ipsum dolor" }, { "paragraph": "lorem ipsum dolor sit" } ] } ]
期望聚合结果
[ { "paragraph": "lorem" }, { "paragraph": "lorem ipsum" }, { "paragraph": "lorem ipsum dolor" }, { "paragraph": "lorem ipsum dolor sit" } ]
解决方案:使用$unwind + $replaceRoot
这是最简洁直观的实现方式,仅需两个聚合阶段:
db.collection.aggregate([ { $unwind: "$content" }, { $replaceRoot: { newRoot: "$content" } } ])
阶段说明
$unwind:将每个原始文档中的content数组拆分为多个独立文档,每个文档对应数组里的一个paragraph对象。比如原doc1会拆成两个文档,各自的content字段对应一个paragraph条目。$replaceRoot:把每个文档的content字段内容替换为根文档,直接得到仅包含paragraph键的目标结构。
备选方案:合并数组后展开(适合大数据量场景)
如果集合中文档数量极多,也可以先合并所有content数组再展开,减少中间文档的生成次数:
db.collection.aggregate([ { $group: { _id: null, allParagraphs: { $push: "$content" } } }, { $unwind: "$allParagraphs" }, { $unwind: "$allParagraphs" }, { $replaceRoot: { newRoot: "$allParagraphs" } } ])
阶段说明
$group:将所有文档的content数组收集到一个名为allParagraphs的二维数组中。- 两次
$unwind:第一次展开二维数组为多个一维数组,第二次展开一维数组为单个paragraph对象。 $replaceRoot:同上,将paragraph对象设为根文档。
内容的提问来源于stack exchange,提问作者Balaram Behera
相关产品推荐
相关产品推荐

