MongoDB多级嵌套数组筛选:提取符合指定paymentType与limits条件的文档
MongoDB查询实现方案
实现思路
- 采用MongoDB聚合框架完成两层嵌套数组的过滤操作
- 先过滤外层
paymentTypes数组,仅保留type为PILOT的元素,减少后续遍历数据量 - 再对筛选出的
PILOT元素,过滤其内部limits数组,仅保留type为COMBAT_HOURS的项
完整查询语句
db.collection.aggregate([ // 可选:仅需查询特定用户时保留该阶段,全量查询可删除 { $match: { user: "CHEWBACCA" } }, // 重写paymentTypes字段,保留其他原始字段 { $project: { user: 1, createdDate: 1, paymentTypes: { $map: { // 第一层过滤:筛选paymentTypes中PILOT类型的元素 input: { $filter: { input: "$paymentTypes", as: "pt", cond: { $eq: ["$$pt.type", "PILOT"] } } }, as: "pilotPt", in: { type: "$$pilotPt.type", limits: { // 第二层过滤:筛选limits中COMBAT_HOURS类型的项 $filter: { input: "$$pilotPt.limits", as: "limit", cond: { $eq: ["$$limit.type", "COMBAT_HOURS"] } } } } } } } } ])
语法说明
$filter操作符用于按照指定条件过滤数组,返回符合条件的元素集合$map操作符用于遍历数组元素,对每个元素做自定义处理后返回新数组$project阶段默认保留原始文档_id字段,显式指定保留user、createdDate字段,最终返回结构和你预期的结果完全一致
内容的提问来源于stack exchange,提问作者Patrick Teixeira
相关产品推荐
相关产品推荐

