0

我有一个分析集合,我将查询存储为单个文档。我想计算过去一天(24 小时)发生的查询次数。这是聚合命令,因为它是:

db.analytics.aggregate([{$group:{_id:{"day":{$dayOfMonth:"$datetime"},"hour":{$hour:"$datetime"}},"count":{$sum:1}}},{$sort:{"_id.day":1,"_id.hour":1}}])

结果如下所示:

.
.
.
        {
            "_id" : {
                "day" : 17,
                "hour" : 19
            },
            "count" : 8
        },
        {
            "_id" : {
                "day" : 17,
                "hour" : 22
            },
            "count" : 1
        },
        {
            "_id" : {
                "day" : 18,
                "hour" : 0
            },
            "count" : 1
        }
.
.
.

最初,我的计划是添加一个$limit操作来简单地获取最后 24 个结果。这是一个很棒的计划,直到您意识到有几个小时根本没有任何查询。因此,最后 24 个文档可以追溯到不止一天。我想过使用$match,但我只是不确定如何构建它。有任何想法吗?

4

1 回答 1

0

首先,您需要获取当前日期或集合中最新文档的日期。然后使用查询指定日期,如:

db.analytics.aggregate([
    {$project:{datetime:"$datetime",day:{$dayOfMonth:"$datetime"}}},
    {$match:{day:3}},
    {$group:{_id:{"hour":{$hour:"$datetime"}},"count":{$sum:1}}},
    {$sort:{"_id.hour":1}}
]);

其中 3 是这里的一个月中的哪一天 {$match:{day: 3 }}

这个想法是添加一个日期字段,因此,我们可以按它进行过滤,然后按小时对当天的文档进行分组并排序。

于 2013-06-29T01:20:16.267 回答