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字段 } } ])
每一步的作用解释
- 第一层
$unwind:把multipleChoice.possibleAnswers数组拆分成单个选项文档,此时每个文档对应原文档的一个选项。 - 第二层
$unwind:针对每个选项里的content数组,把多语言文本拆分成单个条目,此时每个文档对应原文档的一个选项的某一种语言版本。 - 可选的第三层
$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
相关产品推荐
相关产品推荐

