聚合具有自定义时间段的mongodb记录
Aggregate mongodb records with self-defined time period
我有一个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
),我知道我应该使用Mongodb的Aggregate框架,如:
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 }
如果平台信息也能被识别出来,那就更好了。但如果它太复杂,你可以提供一些参考,我会自己深入研究。
任何建议都将不胜感激。
这不是一个真正的问题,也不太难。你只需要"日期数学"来处理你描述的"5分钟间隔",因为这是一个"数字",而不是"日期"值。使用"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"并没有什么不同。
相关文章:
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 如何缩短MongoDB ObjectId并在Mongoose模式中使用它
- MongoDB 2.0.0 驱动程序,按 ID 检索记录时出现问题
- 聚合具有自定义时间段的mongodb记录
- 使用express和node.js更新mongodb中的单个记录
- 立即删除范围记录 - mongodb
- 使用MongoDB和Node JS制作一个带有历史记录的聊天系统
- 异步瀑布返回节点 js 和 mongodb 中数组的单个记录
- 如何在不替换现有字段的情况下更新MongoDB中的记录
- 在mongoDb中,如果字符串输入与任何数组元素匹配,如何获取整个记录(在这种情况下,数组是记录的属性)
- Mongodb根据记录中的字段数进行查询
- 可以't使用backbone.js从mongodb数据库中删除记录
- MongoDB:如何基于ObjectID更新n条记录
- MongoDB确定一条记录是否会通过findOne
- 限制mongodb查询中的记录
- 使用nodejs在mongodb中插入最多数量的记录
- Sails.js+Mongodb使用ORM插入嵌套的json记录
- Mongodb按最后记录到第一个的顺序查找
- 从mongodb获取最新记录,并通过回调进行处理
- 如何正确地将额外的对象字段持久化到mongodb集合中的所有记录