Mongodb汇总多个日期范围的$ group

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本身并不是有序的.

但这就是您在单个查询中执行此操作的方式.您只需根据日期的下降位置计算出分组键的内容,并为每个键累积.