我有一个包含客户报告的事件的Collection,例如:
{ "_id" : ObjectId("54f43159c922ac0b4387ef9c"), "appversion" : "v1.2", "appid" : "930370913", "clkip" : "", "actip" : "", "clktime" : 1425289561, "acttime" : 0, "platform" : "google", "isnotified" : false, "idfa" : "14A900D9-A61A-41DC-A327-96EBE4BA57B31" }
{ "_id" : ObjectId("54f43159c922ac0b4387ef9d"), "appversion" : "v1.2", "appid" : "930370913", "clkip" : "", "actip" : "", "clktime" : 1425289561, "acttime" : 0, "platform" : "google", "isnotified" : false, "idfa" : "14A900D9-A61A-41DC-A327-96EBE4BA57B32" }
{ "_id" : ObjectId("54f43159c922ac0b4387ef9e"), "appversion" : "v1.2", "appid" : "930370913", "clkip" : "", "actip" : "", "clktime" : 1425289561, "acttime" : 0, "platform" : "facebook", "isnotified" : false, "idfa" : "14A900D9-A61A-41DC-A327-96EBE4BA57B33" }
{ "_id" : ObjectId("54f43159c922ac0b4387ef9f"), "appversion" : "v1.2", "appid" : "930370913", "clkip" : "", "actip" : "", "clktime" : 1425289561, "acttime" : 0, "platform" : "google", "isnotified" : false, "idfa" : "14A900D9-A61A-41DC-A327-96EBE4BA57B34" }
你可以看到clktime
是一个unix时间戳(自定义,而不是Mongodb生成的那个),精度为Second。我想知道每个paltform报告的每5分钟有多少事件(clktime
1}}),我知道我应该使用mongodb的Aggregate框架,例如:
db.event.aggregate([{$match:{clktime:{$gt:1425204775}}},{$group:{_id:???, count:{$sum:1}}}])
^^^
I really don't know what this _id should be.
但我不知道如何定义_id
的{{1}}: - (
我想要实现的输出是这样的:
$group
如果能够识别平台信息,那将更好。但如果它太复杂,你可以提供一些参考,我会自己深入研究。
任何建议都会受到赞赏。
答案 0 :(得分:3)
真的不是问题,也不是太难。你只需要"日期数学"使用" 5分钟间隔"你描述的,因为这是一个"数字"而不是" date"值。它仍然可以用" Date"对象(你应该真正使用它们,因为几乎没有开销,处理上没有太大差别),但让我们坚持这一点:
db.event.aggregate([
{ "$match": { "clktime":{ "$gt": 1425204775 } } },
{ "$group": {
"_id": {
"$subtract": [
"$clktime",
"$mod": [ "$clktime", 60 * 5 ] // 5 minutes in seconds
]
},
"count": { "$sum": 1 }
}}
])
将值四舍五入为5分钟,可在_id
分组键中获取所需的分组数据。
同样,_id
值是"分组键",因此您的预期结果无效,并且它只能是"唯一分组"根据。这与SQL" GROUP BY"没有任何不同。如果你熟悉那个。