mongodb:两个日期之间每小时的聚合

时间:2017-04-05 17:01:54

标签: mongodb aggregation-framework

我有一个包含' firstSeen'和' lastSeen'字段为日期,如下所示:

{
  "_id" : ObjectId("58e4db42a8782455eb037590"),
  "firstSeen" : ISODate("2017-04-05T00:41:17.575Z"),
  "lastSeen" : ISODate("2017-04-05T01:16:28.015Z"),
  ...
}

我想聚合以获得每小时活动项目的数量,以便我可以在仪表板上绘制图表; e.g。

[
    { ISODate('2017-05-04T01:00:00.000Z'): { total: 1 } },
    { ISODate('2017-05-04T02:00:00.000Z'): { total: 2 } },
    { ISODate('2017-05-04T03:00:00.000Z'): { total: 1 } }
]

所以我试图询问Mongo的问题就像"让我得到设备的数量,在起点和终点之间的每小时,这个小时是在它们之间firstSeen和lastSeen"

我已经到了这个阶段:

coll.aggregate([{$match : {
    firstSeen: { $gte: ISODate('2017-01-01T00:00:00.000Z') },
    lastSeen: { $lte: ISODate('2017-05-01T00:00:00.000Z') },
    }},
{
$group : {
    _id : {
        hour: { $hour: "$firstSeen" },
        month: { $month: "$firstSeen" }, 
        day: { $dayOfMonth: "$firstSeen" },
        year: { $year: "$firstSeen" }
    },
    total: { $sum: 1 },
}
}])

这让我很接近,但我的$group并不完全存在:这会根据firstSeen进行汇总,这意味着如果我有一份文件,其中有{&1;从早上1点到凌晨4点,只会在凌晨1点反映,而不是凌晨2点/凌晨3点。

我相信我需要使用$addFields或类似内容才能为每小时创建一个'文档上的值然后聚合在一起,以便它可以包含在几个总数中,但我不确定如何去做。

以前有人做过这类事吗?

Mongo 3.4,我的应用程序是Node.js,以防万一。

0 个答案:

没有答案