如何将MongoDB聚合结果中嵌套debates数组合并为单一数组
MongoDB聚合:合并嵌套debates数组为单一数组
你可以通过修改聚合管道,添加对应阶段来实现需求,以下是几种可行方案:
方案一:直接展开并转换为单一对象数组
适合需要直接得到所有debates对象组成的数组场景:
Data = await debate.aggregate([ { $sort: { updatedAt: -1 } }, { $limit: 8 }, // 拆分每个文档的debates数组,生成对应元素的独立文档 { $unwind: "$debates" }, // 将debates元素内容设为文档根结构 { $replaceRoot: { newRoot: "$debates" } } ]).exec()
阶段说明:
$unwind:把每个含debates数组的文档拆分为多个文档,每个文档对应原数组的一个元素$replaceRoot:将拆分后文档的debates字段内容替换为整个文档的根,最终输出就是所有debates对象的数组
方案二:保留原文档字段合并
如果需要同时保留原文档的部分字段(比如updatedAt),可以调整为:
Data = await debate.aggregate([ { $sort: { updatedAt: -1 } }, { $limit: 8 }, { $unwind: "$debates" }, { $project: { _id: 0, // 保留原文档的更新时间字段 sourceUpdatedAt: "$updatedAt", // 合并debates的所有字段 ..."$debates" } } ]).exec()
方案三:合并为数组包装对象
适合需要返回带debates字段的对象结构场景:
Data = await debate.aggregate([ { $sort: { updatedAt: -1 } }, { $limit: 8 }, // 分组合并所有debates数组 { $group: { _id: null, debates: { $concatArrays: ["$debates"] } } }, // 移除默认的_id字段 { $project: { _id: 0 } } ]).exec()
最终会返回{ debates: [/* 合并后的所有对象 */] },可通过Data[0].debates直接提取目标数组。
内容的提问来源于stack exchange,提问作者Shreyas H
相关产品推荐
相关产品推荐

