我有一个包含' 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,以防万一。