MongoDB Compass如何过滤文档内嵌数组对象 替代$elemMatch获取全部匹配项
解决方案
要获取内嵌数组中所有符合正则匹配的元素,你需要使用聚合管道搭配$filter操作符来实现,具体实现如下:
完整查询语句
db.你的集合名.aggregate([ // 第一步:先过滤外层符合条件的文档,减少后续计算量 { $match: { "ImportKeyId": 5843, // 可选预过滤:提前筛掉数组内没有符合PhotoId规则的文档,提升效率 "MissingPersonIds.PhotoId": { $regex: /202020 /i } } }, // 第二步:过滤MissingPersonIds数组,保留所有符合正则匹配的元素 { $addFields: { "MissingPersonIds": { $filter: { input: "$MissingPersonIds", as: "item", cond: { $regexMatch: { input: "$$item.PhotoId", regex: /202020 /i } } } } } }, // 可选步骤:如果需要限制返回数组长度,类似你之前用的$slice效果,可加这一层 { $addFields: { "MissingPersonIds": { $slice: ["$MissingPersonIds", 5] // 仅保留前5条匹配结果 } } } ])
注意事项
- 如果你使用的MongoDB版本低于4.2,不支持
$regexMatch操作符,可以把cond判断逻辑替换为以下写法(不区分大小写的模糊匹配):cond: { $ne: [ { $indexOfBytes: [ { $toLower: "$$item.PhotoId" }, "202020 " ] }, -1 ] } - 你之前使用的投影层
$elemMatch本身设计上就仅返回数组中第一个匹配的元素,天生不支持返回所有匹配结果,所以必须用聚合管道的数组操作符实现需求。
内容的提问来源于stack exchange,提问作者Abhishek Vyas
相关产品推荐
相关产品推荐

