Zhe*_*Liu 11 mongodb mongodb-query aggregation-framework
在我的汇总中,流中的每个文档都有一个日期.
我需要在日期范围内总结一些值.
IE浏览器.
{
value: 3,
date: [SoME TIME STAMP]
},
{
value: 4,
date: [SoME TIME STAMP]
},
{
value: 1,
date: [SoME TIME STAMP]
},
{
value: -6,
date: [SoME TIME STAMP]
}
Run Code Online (Sandbox Code Playgroud)
我希望能够根据日期范围对这些文档进行分组.IE:1-7天前,8-15天前.和15-30天前.
db.Collection.aggregate([
{$match: {some matching}},
{$group: {What should i do here??}}
])
Run Code Online (Sandbox Code Playgroud)
我当然可以做3种不同的聚合,在日期上有3种不同的$ match.
是否可以在一次运行中执行所有$ group并将"value"字段相加?
Bla*_*ven 26
您需要根据当前日期在范围之间的位置有条件地确定分组键.这基本上是通过$cond
嵌套条件和以下逻辑变体实现的$lt
:
// work out dates somehow
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" }
}}
])
Run Code Online (Sandbox Code Playgroud)
与$cond
三元运算符一样,第一个条件被计算以查看条件是否为真,而当为真时,返回第二个参数,否则返回第三个条件为false.因此,通过$cond
在虚假案例中嵌套另一个,您可以对日期所在的位置进行逻辑测试,或者"减去15天的日期",这意味着它在最旧的范围内,或者"少于7天",这意味着中间范围,或者当然它是在最新的范围内.
我只是在这里用小于10的数字作为前缀,0
因此如果你愿意,它会给你一些排序的东西,因为"keys"的输出$group
本身并不是有序的.
但这就是您在单个查询中执行此操作的方式.您只需根据日期的下降位置计算出分组键的内容,并为每个键累积.
归档时间: |
|
查看次数: |
16414 次 |
最近记录: |