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

MongoDB如何展开嵌套在数组中的数组?附示例集合

如何对MongoDB中嵌套数组执行$unwind操作

嘿,这个问题我太熟悉了!要处理MongoDB里这种嵌套在数组内的数组的$unwind操作,核心思路就是一层一层来,多次调用$unwind——毕竟$unwind只能直接处理当前文档层级的数组,没法跳过外层直接拆内层。咱们结合你给出的集合结构,一步步来拆解。

先明确你的文档结构里的嵌套数组层级

你的questions集合文档里有三层数组需要关注:

  • 最外层的content:存储问题的多语言文本
  • multipleChoice.possibleAnswers:存储选择题的选项列表
  • 每个选项内的content:存储选项的多语言文本

如果要把这些嵌套数组全部展开成单条文档,只需要依次对每个数组路径执行$unwind即可。

具体的聚合查询示例

下面是针对你的场景写的完整聚合命令,包含多层$unwind和可选的字段投影:

db.questions.aggregate([
  // 第一步:展开选择题的选项数组
  {
    $unwind: "$multipleChoice.possibleAnswers"
  },
  // 第二步:展开每个选项里的多语言内容数组
  {
    $unwind: "$multipleChoice.possibleAnswers.content"
  },
  // 可选:如果需要展开最外层的问题多语言内容,添加这一步
  {
    $unwind: "$content"
  },
  // 可选:投影出需要的字段,让结果更简洁易读
  {
    $project: {
      questionText: "$content.text",
      questionLanguage: "$content.languageId",
      optionText: "$multipleChoice.possibleAnswers.content.text",
      optionLanguage: "$multipleChoice.possibleAnswers.content.languageId",
      optionSequence: "$multipleChoice.possibleAnswers.sequence",
      _id: 0 // 隐藏默认的_id字段
    }
  }
])

每一步的作用解释

  1. 第一层$unwind:把multipleChoice.possibleAnswers数组拆分成单个选项文档,此时每个文档对应原文档的一个选项。
  2. 第二层$unwind:针对每个选项里的content数组,把多语言文本拆分成单个条目,此时每个文档对应原文档的一个选项的某一种语言版本。
  3. 可选的第三层$unwind:如果需要把问题的多语言文本也展开成单条,就加上这一步,最终每个文档会对应「问题的某语言版本 + 选项的某语言版本」的组合。

查询结果示例

执行上述聚合后,你会得到类似这样的单条文档(以第一个选项为例):

{
  "questionText": "What are you planning to buy today at the supermarket?",
  "questionLanguage": "en",
  "optionText": "apples",
  "optionLanguage": "en",
  "optionSequence": 1
}
{
  "questionText": "What are you planning to buy today at the supermarket?",
  "questionLanguage": "en",
  "optionText": "appels",
  "optionLanguage": "nl",
  "optionSequence": 1
}
{
  "questionText": "Wat ben je van plan om vandaag in de supermarkt te kopen?",
  "questionLanguage": "nl",
  "optionText": "apples",
  "optionLanguage": "en",
  "optionSequence": 1
}

注意事项

  • 如果只需要展开某一层嵌套数组(比如只展开选项的多语言内容),必须先展开它的外层数组(也就是possibleAnswers),否则MongoDB找不到内层数组的路径。
  • $unwind会保留原文档的所有其他字段,所以如果不需要某些字段,可以用$project或者$unset来过滤。

内容的提问来源于stack exchange,提问作者Herman Fransen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:16:27