MongoDB 5中如何筛选匹配正则条件的所有子文档?
实现方案
你之前遇到$filter不支持$regex的问题,是因为$regex属于查询层运算符,无法直接在聚合表达式场景中使用,MongoDB 4.2及以上版本(包括你使用的MongoDB 5)提供了聚合专用的正则匹配运算符$regexMatch,配合$filter即可实现子文档数组的正则筛选。
完整查询示例
db.你的集合名.aggregate([ // 第一步:先过滤出owner为Jim的文档,缩小计算范围,提升查询效率 { $match: { owner: "Jim" } }, // 第二步:过滤pets数组,仅保留符合正则条件的宠物 { $project: { owner: 1, // 不需要返回owner字段可删除该行 matchedPets: { $filter: { input: "$pets", as: "pet", cond: { $regexMatch: { input: "$$pet.name", regex: /^M/ // 匹配以M开头的正则规则,可按需修改 // 如需忽略大小写,可追加配置:options: "i" } } } } } } ])
补充说明
- 正则规则支持标准PCRE语法,比如匹配名字包含
o可写为/o/,匹配名字以ky结尾可写为/ky$/ options可选参数支持正则修饰符:i忽略大小写、m多行匹配、x忽略空白字符、s允许.匹配换行符- 如果需要直接返回扁平化的宠物子文档列表,不需要嵌套在父文档结构中,可以在上述管道后追加两个阶段:
// 展开匹配到的宠物数组 { $unwind: "$matchedPets" }, // 直接将宠物子文档作为返回结果 { $replaceRoot: { newRoot: "$matchedPets" } }
内容的提问来源于stack exchange,提问作者tiltowait
相关产品推荐
相关产品推荐

