MongoDB Compass 数组对象过滤查询未生效问题排查求助
问题原因
你写的两种过滤语句作用是筛选包含符合条件数组成员的文档,而非过滤数组内部的元素。你当前使用的$slice投影仅支持按位置截取数组片段,无法根据字段值过滤数组成员,因此会出现过滤条件不生效的错觉。
解决方案
方案1:普通查询返回首个匹配元素
如果你只需要返回数组中第一个匹配的元素,保留原Filter过滤条件,将投影规则替换为$elemMatch投影即可:
- Filter配置保持不变,任选以下一种即可:
{ MissingPersonIds : {$elemMatch: { PhotoId : '2 - Copy (3).jpg'}} }
或者
{ "MissingPersonIds.PhotoId" : "2 - Copy (3).jpg" }
- 投影配置替换为:
{ ImportKeyId: 1, MissingPersonIds: { $elemMatch: { PhotoId: '2 - Copy (3).jpg' } } }
注:_id字段默认返回,无需额外配置。
方案2:聚合查询返回所有匹配元素
如果需要返回数组中所有符合条件的元素,需要使用聚合管道实现,在MongoDB Compass中切换到「Aggregations」标签,依次添加两个阶段:
- $match阶段(筛选符合条件的文档,降低后续处理开销):
{ "MissingPersonIds.PhotoId": "2 - Copy (3).jpg" }
- $project阶段(过滤数组内部元素):
{ ImportKeyId: 1, MissingPersonIds: { $filter: { input: "$MissingPersonIds", cond: { $eq: ["$$this.PhotoId", "2 - Copy (3).jpg"] } } } }
内容的提问来源于stack exchange,提问作者Abhishek Vyas
相关产品推荐
相关产品推荐

