MongoDB聚合阶段如何筛选布尔数组不含false值的文档
问题场景
现有MongoDB集合文档结构示例如下:
[ { _id: 132143124, orders: [true, false, false], }, { _id: 3123, orders: [true, true, true], }, ];
需求:基于MongoDB聚合管道实现查询,仅返回orders数组中不存在false值的文档。
聚合实现方案
以下两种聚合写法都可满足需求,针对上述示例数据,两种写法都会过滤掉_id: 132143124的文档,仅返回全为true值的_id: 3123文档:
写法1:
$elemMatch搭配$not操作符
该写法直接在$match阶段通过原生数组查询规则过滤,不需要调用聚合表达式,查询性能更优:db.你的实际集合名.aggregate([ { $match: { orders: { // 规则:orders数组中不存在任何等于false的元素 $not: { $elemMatch: { $eq: false } } } } } ])写法2:
$expr搭配$allElementsTrue聚合表达式
如果你需要在聚合阶段叠加更多字段计算、逻辑判断规则,可以使用聚合表达式的写法:db.你的实际集合名.aggregate([ { $match: { $expr: { // 规则:orders数组内所有元素均为真值 $allElementsTrue: "$orders" } } } ])
补充场景适配:如果业务要求
orders数组非空、且所有元素均为true,可以追加数组长度判断,参考代码如下:db.你的实际集合名.aggregate([ { $match: { $expr: { $and: [ { $gt: [{ $size: "$orders" }, 0] }, { $allElementsTrue: "$orders" } ] } } } ])
内容的提问来源于stack exchange,提问作者Valeri
相关产品推荐
相关产品推荐

