聚合 mongodb 条自定义时间段的记录
Aggregate mongodb records with self-defined time period
我有一个集合,其中包含客户端报告的一些事件,例如:
{ "_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 生成的),精度为第二,我想知道每个平台每 5 分钟有多少事件已报告(clktime
),我知道我应该使用 mongodb 的聚合框架,例如:
db.event.aggregate([{$match:{clktime:{$gt:1425204775}}},{$group:{_id:???, count:{$sum:1}}}])
^^^
I really don't know what this _id should be.
但我不知道如何定义 $group
的 _id
:-(
我想要实现的输出是这样的:
{ "_id" : 0, "time":1425207775, "count" : 100 }
{ "_id" : 0, "time":1425210775, "count" : 51 }
{ "_id" : 0, "time":1425213775, "count" : 51 }
如果平台信息也能识别就更好了。但是如果太复杂,你可以给点参考,我自己去深挖。
如有任何建议,我们将不胜感激。
真的不是问题,也不是太难。您只需要 "date math" 来处理您描述的“5 分钟间隔”,因为这是 "number" 而不是 "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
值是 "grouping key",因此您的预期结果无效,它只能是 "uniquely grouped" 所基于的结果。如果您熟悉的话,这与 SQL "GROUP BY" 并没有什么不同。
我有一个集合,其中包含客户端报告的一些事件,例如:
{ "_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 生成的),精度为第二,我想知道每个平台每 5 分钟有多少事件已报告(clktime
),我知道我应该使用 mongodb 的聚合框架,例如:
db.event.aggregate([{$match:{clktime:{$gt:1425204775}}},{$group:{_id:???, count:{$sum:1}}}])
^^^
I really don't know what this _id should be.
但我不知道如何定义 $group
的 _id
:-(
我想要实现的输出是这样的:
{ "_id" : 0, "time":1425207775, "count" : 100 }
{ "_id" : 0, "time":1425210775, "count" : 51 }
{ "_id" : 0, "time":1425213775, "count" : 51 }
如果平台信息也能识别就更好了。但是如果太复杂,你可以给点参考,我自己去深挖。
如有任何建议,我们将不胜感激。
真的不是问题,也不是太难。您只需要 "date math" 来处理您描述的“5 分钟间隔”,因为这是 "number" 而不是 "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
值是 "grouping key",因此您的预期结果无效,它只能是 "uniquely grouped" 所基于的结果。如果您熟悉的话,这与 SQL "GROUP BY" 并没有什么不同。