MongoDB查询:筛选内嵌数组所有元素满足指定值的文档
MongoDB 查询:筛选内嵌数组所有元素foo属性均为true的文档
要实现仅返回内嵌objects数组中所有元素的foo属性都等于true的文档(数组中存在元素无foo属性或foo≠true则排除),可以用以下两种方法:
方法1:反向排除不符合条件的文档
通过$not结合$elemMatch,排除存在不符合要求元素的文档,剩下的就是全部元素符合条件的文档:
db.collection.find({ $not: { $elemMatch: { $or: [ { foo: { $ne: true } }, { foo: { $exists: false } } ] } } })
逻辑说明
$elemMatch会匹配数组中任意一个满足以下条件的元素:foo不等于true,或者foo属性不存在$not对上述匹配结果取反,最终得到所有元素都满足foo存在且等于true的文档
方法2:使用聚合表达式验证所有元素(MongoDB 3.2+)
利用$expr结合$allElementsTrue和$map,直接验证数组所有元素的foo值:
db.collection.find({ $expr: { $allElementsTrue: { $map: { input: "$objects", as: "obj", in: { $eq: ["$$obj.foo", true] } } } } })
逻辑说明
$map遍历objects数组,将每个元素转换为foo是否等于true的布尔值,生成一个布尔数组$allElementsTrue检查这个布尔数组是否所有元素都是true,只有全部为true的文档才会被选中
示例验证
假设集合数据如下:
[ { _id: 1, objects: [{ foo: true }, { foo: false }] }, { _id: 2, objects: [{ foo: true }, { bar: "test" }] }, { _id: 3, objects: [{ foo: true }, { foo: true }] } ]
运行上述任意查询,都会仅返回_id: 3的文档,符合需求。
内容的提问来源于stack exchange,提问作者Denys Siebov
相关产品推荐
相关产品推荐

