MongoDB如何查询过滤深度未知嵌套数组中指定fieldToFilterBy值的文档
解决方案
方案1:使用自定义JS递归查询(MongoDB 4.4+ 适用,最简洁)
无需修改原有数据结构,自动适配任意嵌套深度,查询语句如下:
// 示例为筛选fieldToFilterBy等于"2"的文档,可自行替换目标值 db.yourCollectionName.find({ $expr: { $function: { body: function(categories, target) { const check = node => node ? (node.fieldToFilterBy === target || check(node.child)) : false return categories.some(check) }, args: ["$categories", "2"], lang: "js" } } })
方案2:低版本MongoDB兼容方案
如果你的MongoDB版本低于4.4不支持$function,可使用聚合管道预展开所有层级值再筛选:
db.yourCollectionName.aggregate([ // 临时生成所有层级的fieldToFilterBy数组 { $addFields: { _allValues: { $reduce: { input: "$categories", initialValue: [], in: { $concatArrays: [ "$$value", ["$$this.fieldToFilterBy"], { $ifNull: ["$$this.child.fieldToFilterBy", []] }, { $ifNull: ["$$this.child.child.fieldToFilterBy", []] }, // 按你业务中可能的最大嵌套深度补充对应行即可,比写多层$or更简洁 ] } } } } }, // 匹配目标值 { $match: { _allValues: "2" } }, // 移除临时字段,返回原文档结构 { $project: { _allValues: 0 } } ])
内容的提问来源于stack exchange,提问作者jowitty
相关产品推荐
相关产品推荐

