我试图将具有子数组元素值的行数计为true。
{ _id:1, 名称:‘test’, items:[{‘name’:‘harry’,valid:true}]},{ _id:2, 名称:‘walter’, …
db.collection.aggregate( { $group: { _id:1, valid:{ $sum: {$cond: [{$eq: ['$items.valid',true]},1,0]} } , nonValid:{ $sum: {$cond: {if:{$eq: ["$items.valid",false]},then:1,else:0}} }, count:{$sum: 1}, } }, { $project: {_id:0} } )
你需要 group Id为1的文档,并使用条件计数 $ COND 同 $总和 并压制 _id 。
group
_id
db.collection.aggregate([ { "$group": { "_id": null, "count": { "$sum": 1 }, "valid": { "$sum": { "$size": { "$filter": { "input": "$items", "cond": "$$this.valid" } } }, "nonValid": { "$sum": { "$size": { "$filter": { "input": "$items", "cond": { "$not": "$$this.valid" } } } } } }} ])
你只需要一个 $group 管道和 $sum 累加器在这里。 “计数阵列”通过完成 $size 来自匹配元素 $filter 在哪里 cond 要求一个布尔表达式。
$group
$sum
$size
$filter
cond
以来 valid 在数组项中已经是布尔值,返回的值必须是 true 是的 valid 数,或 $not true 成为 nonValid
valid
true
$not
nonValid