在MongoDB中,我有如下文档(我交叉了保密要求的名称):
现在,我需要构建一个查询来返回按呼叫名称分组的结果,对于每种类型的呼叫,我需要按月、日和小时获取呼叫数量。此外,在这个查询中,我需要指示两个日期(包括时间)之间的范围。
在SQL server中,这是通过结合使用窗口函数(分区)和聚合来完成的,但我如何在Mongo中做到这一点呢?
我使用MongoDB指南针作为mongo客户端。
我需要获得以下内容:
call name month day hour #ByMonth #ByDay #ByHour
GetEmployee January 1 14 10 6 1
GetEnployee January 1 18 10 6 5
GetEmployee January 3 12 10 4 4
GetEmployee March 5 20 8 8 8
GetEmployee April 12 17 45 35 35
GetEmployee April 20 10 45 10 10
例如,对于GetEmployee调用,分布如下:
-
1月份拨打了10个电话
-
3月份打了8个电话
-
4月份拨打了45个电话
1月份的10个电话分配如下:
-
1月1日拨打了6个电话(这6个电话的分布如下:14小时拨打1个电话,18小时拨打5个电话)
-
1月3日打了4个电话(这4个电话都是在12小时打的)
接下来的几个月也是如此。
例如,在SQL Server中,如果我有下表:
processName initDateTime
processA 2020-06-15 13:31:15.330
processB 2020-06-20 10:00:30.000
processA 2020-06-20 13:31:15.330
...
and so on
SQL查询是:
select
processName,
month(initDateTime),
day(initDateTime),
datepart(hour, initDateTime),
sum(count(*)) over(partition by processName, year(initDateTime), month(initDateTime)) byMonth,
sum(count(*)) over(partition by processName, year(initDateTime), month(initDateTime), day(initDateTime)) byDay,
count(*) byHour
from mytable
group by
processName,
year(initDateTime),
month(initDateTime),
day(initDateTime),
datepart(hour, initDateTime)
那么如何在Mongo做同样的事情呢?上面的processName和initDateTime字段在mongodb中分别是“call”和“created”属性。