根据当前日期在范围内的位置有条件地确定分组键。这基本上是通过使用嵌套条件和$cond
的逻辑变量$lt
来实现的:
var today = new Date(),
oneDay = ( 1000 * 60 * 60 * 24 ),
thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );
db.collection.aggregate([
{ "$match": {
"date": { "$gte": thirtyDays }
}},
{ "$group": {
"_id": {
"$cond": [
{ "$lt": [ "$date", fifteenDays ] },
"16-30",
{ "$cond": [
{ "$lt": [ "$date", sevenDays ] },
"08-15",
"01-07"
]}
]
},
"count": { "$sum": 1 },
"totalValue": { "$sum": "$value" }
}}
])
由于$cond
是三元运算符,第一个条件被评估以查看条件是否为真,当为真时返回第二个参数,否则在假的情况下返回第三个参数。因此,通过在假的情况下嵌套另一个$cond
,您可以获得日期落在哪个逻辑测试上的结果,即“小于15天的日期”表示它在最旧的范围内,或者“小于7天”表示它在中间范围内,或当然,它在最新的范围内。
我只是在这里使用0
来为小于10的数字添加前缀,以便在需要排序时提供输出,因为$group
中的“键”本身并没有按顺序排列。
但这就是您在单个查询中执行此操作的方式。您只需根据日期所在的位置确定分组键,并累积每个键。
$cond
)的主要用途。 - Blakes Seven