MongoDB聚合查询:提取嵌套子文档生成统一结果数组
实现嵌套数组扁平化提取的聚合方案
可直接复用的聚合管道如下,根据实际字段路径调整即可:
db.collection.aggregate([ { $set: { flashcardReversed: { $reduce: { input: "$types.flashcardReversed", initialValue: [], in: { $concatArrays: [ "$$value", ["$$this.normal", "$$this.reversed"] ] } } } } }, { $project: { _id: 0, flashcardReversed: 1 } } ])
注:你给出的期望结果中存在一处笔误,第三个元素重复展示了第一组的
reversed对象。实际执行上述管道后,会按顺序提取原数组每个项内的normal、reversed子对象,最终形成包含所有独立卡片信息的扁平数组,和输入结构完全对应。
性能与场景适配说明
- 该方案全程未使用
$unwind拆分文档,所有操作在单文档内完成数组转换,替代了多步拆分、合并的传统实现思路。单文档最多2000个卡片的规模下,不会产生海量临时文档,执行效率远高于多步unwind后再聚合的实现方式 - 管道内没有跨文档的聚合操作,完全可以直接嵌入
$facet的子管道中使用,不会引入额外的性能开销 - 针对React前端的使用场景,可在最后
$project阶段按需裁剪返回字段,对前端不需要的内部字段直接移除,有效压缩返回数据包体积,提升页面加载速度 - 基于同一Mongoose Schema生成的所有卡片结构一致,提取过程中不需要额外做结构兼容性判断,直接生成的数组可直接映射到前端列表组件
内容的提问来源于stack exchange,提问作者Sour_Tooth
相关产品推荐
相关产品推荐

