MongoDB如何查询所有嵌套子属性都匹配过滤条件的嵌入文档
MongoDB嵌套数组全匹配查询方案
核心需求说明
你需要筛选data数组中满足 bets子数组所有元素的exchange字段都等于指定值 的嵌套对象,原有基础查询只能匹配存在至少一个符合条件的元素,无法满足「全匹配」要求,也无法过滤data数组内的元素。
实现代码
使用MongoDB聚合管道实现,完整查询代码如下:
// 替换collection为你的实际集合名 db.collection.aggregate([ // 拆分data数组,将每个嵌套元素转为独立文档方便过滤 { $unwind: "$data" }, // 过滤符合条件的data元素:bets数组不存在exchange不等于'Smarkets'的元素 { $match: { "data.bets": { $not: { $elemMatch: { exchange: { $ne: "Smarkets" } } } } } }, // 可选步骤:如果需要将符合条件的data重新组合为数组,保留原文档结构,添加以下配置 { $group: { _id: "$_id", sport: { $first: "$sport" }, site: { $first: "$site" }, data: { $push: "$data" } } } ])
逻辑说明
- 核心过滤采用反向排除思路:只要
bets数组中存在任意一个exchange不等于目标值的元素,就排除该data对象,剩下的自然就是所有bets都满足条件的对象,刚好匹配你要求的仅返回_id为'2'的嵌套对象的需求。 - 如果你只需要获取符合条件的
data嵌套对象,不需要保留原文档结构,可以省略最后一步$group,查询结果会直接返回符合要求的data独立文档。 - 如果需要适配不同的exchange过滤值,只需要替换
$ne对应的对比值即可。
内容的提问来源于stack exchange,提问作者willmahoney
相关产品推荐
相关产品推荐

