我有一个分析集合,我将查询存储为单个文档。我想计算过去一天(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
,但我只是不确定如何构建它。有任何想法吗?
答案 0 :(得分: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 }}
这个想法是添加一个日期字段,因此,我们可以通过它进行过滤,然后按小时对文档进行分组并进行排序。