代码之家  ›  专栏  ›  技术社区  ›  Willy

在MongoDB中结合使用分区(窗口函数)和聚合

  •  0
  • Willy  · 技术社区  · 5 年前

    在MongoDB中,我有如下文档(我交叉了保密要求的名称):

    enter image description here

    现在,我需要构建一个查询来返回按呼叫名称分组的结果,对于每种类型的呼叫,我需要按月、日和小时获取呼叫数量。此外,在这个查询中,我需要指示两个日期(包括时间)之间的范围。

    在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”属性。

    0 回复  |  直到 5 年前