You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 22:27:19