如果我有一个像这样的模式:
var person = new Schema({
active: {type: Boolean},
otherSetting: {type: Boolean}
});
是否可能只使用一个查询来获得所有人的总数,活动的总人数,不活动的总人数,以及otherSetting设置为true和otherSetting设置为false的总人数?otherSetting和active是否必须分成两个查询?
我一直在玩围绕这个问题的聚合框架,虽然这似乎是一个简单的问题,我似乎不能做到只有一个查询。
这可能吗?谢谢你的帮助。
聚合框架有逻辑运算符,如 $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
(then)或false
(else)值。
在$cond
的第一个参数中,"布尔值"被计算为true/false
,该参数将适当的值传递给$sum
以获得条件总计。
由于您想要将整个集合加起来,因此所有内容都在单个$group
管道阶段中工作,并使用null
的分组键_id
。如果对另一个字段的值进行分组,则将该null
替换为您想要的字段。