如果我的架构看起来像这样:
var person = new Schema({
active: {type: Boolean},
otherSetting: {type: Boolean}
});
仅使用一个查询就可以获得所有人的总计数,活跃的总人数,非活动人数以及其他设置设置为true的人的总数其他设置为false? otherSetting和active必须分成两个查询吗?
我一直在讨论这个问题的聚合框架,虽然这看起来像一个简单的问题但我似乎只用一个查询来做。
甚至可能吗?谢谢你的帮助。
答案 0 :(得分:2)
aggregation framework具有$cond
等逻辑运算符,可以很好地处理您的布尔值:
db.collection.aggregate([
{ "$group": {
"_id": null,
"active": { "$sum": { "$cond": [ "$active", 1, 0 ] } },
"inActive": { "$sum": { "$cond": [ "$active", 0, 1 ] } },
"total": { "$sum": 1 }
}}
])
$cond
运营商是"三元"运算符(if / then / else)允许评估逻辑条件以返回true
(然后)或false
(else)值。
"布尔"在true/false
的第一个参数中被评估为$cond
,该参数将适当的值传递给$sum
以获得条件总计。
所有内容都在单个$group
管道阶段中,_id
的分组键null
,因为您想要将整个集合相加。如果对另一个字段的值进行分组,则将null
替换为您想要的字段。