Mongodb计数结果按日期范围分组

MrB*_*Win 2 mongodb mongodb-query aggregation-framework

我有这样的文件:

{name: 'doc1', date: "2015-01-01T02:00:12+01:00"},
{name: 'doc2', date: "2015-01-01T03:02:12+01:00"},
{name: 'doc3', date: "2015-01-01T02:17:55+01:00"}
Run Code Online (Sandbox Code Playgroud)

是否可以按时间间隔计算它们(例如:15分钟)并得到如下结果:

{startDate: "2015-01-01T02:00:12+01:00", count: 15},
{startDate: "2015-01-01T02:15:12+01:00", count: 11},
{startDate: "2015-01-01T02:30:12+01:00", count: 21},
...`
Run Code Online (Sandbox Code Playgroud)

Nei*_*unn 5

您无法获得以这种方式返回的"实际"日期对象,但您可以获取可用于构造日期对象的时间戳值.我只是一个日期数学的简单问题:

db.collection.aggregate([
    { "$group": 
        "_id": {
            "$subtract": [
                { "$subtract": [ "$date", new Date("1970-01-01") ] },
                { "$mod": [
                    { "$subtract": [ "$date", new Date("1970-01-01") ] },
                    1000 * 60 * 15
                ]}
            ]
        },
        "count": { "$sum": 1 }
    }}
])
Run Code Online (Sandbox Code Playgroud)

使用纪元日期减去"日期对象"将导致当前时间戳值为数字.基本数学是与15分钟间隔的模数的差异(1000毫安*60秒*15分钟).

如果您愿意,实际上还有日期聚合运算符,它们也可以分割日期.同样的情况是这些是数字而不是日期,但您可以从那里的值重新构造日期对象.

db.collection.aggregation([
    { "$group": {
        "_id": {
            "year": { "$year": "$date" },
            "month": { "$month": "$date" },
            "dayOfMonth": { "$dayOfMonth": "$date" },
            "hour": { "$hour" },
            "minute": {
                "$subtract": [
                    { "$minute": "$date" },
                    { "$mod": [
                        { "$minute": "$date" },
                        15    
                    ]}
                ]
            }
        },
        "count": { "$sum": 1 }
    }}
])
Run Code Online (Sandbox Code Playgroud)