Mongo,在历史收藏中每小时只挑选第一笔交易
Posted
技术标签:
【中文标题】Mongo,在历史收藏中每小时只挑选第一笔交易【英文标题】:Mongo, picking only first transaction for every hour in historic collection 【发布时间】:2013-11-27 02:49:37 【问题描述】:我的收藏包含一段时间内的货币汇率。我希望显示一个图表,我只需要知道每小时的一个值。但是我的数据要密集得多,大约每秒有一条记录。
如何降低每小时只留下一条记录的密度。我不需要平均值,每小时的任何记录就足够了。
"_id" : ObjectId("52112613b45b5d057589009e"),
"date" : ISODate("2013-08-18T19:52:51.873Z"),
"rate" : 0.00007382007912027975,
"symbol" : "XAU=X"
"_id" : ObjectId("52112613b45b5d057589009f"),
"date" : ISODate("2013-08-18T19:52:52.273Z"),
"rate" : 0.00007382007912083746,
"symbol" : "XAU=X"
请在您的回答中考虑性能。
谢谢。
【问题讨论】:
【参考方案1】:您可以使用聚合框架,但如果您真的关心性能,您可能应该考虑将历史记录保存在预先聚合的集合中。
如果您可以使用除每小时第一条以外的记录,则可以省略$sort
阶段并直接转至$group
。
pipeline = [
"$sort" :
"date" : 1
,
"$group" :
"_id" :
"symbol" : "$symbol",
"hour" : "$hour" : "$date" ,
"day" : "$dayOfMonth" : "$date" ,
"month" : "$month" : "$date" ,
"year" : "$year" : "$date"
,
"rate" : "$first" : "$rate" ,
"symbol" : "$first" : "$symbol" ,
"date" : "$first" : "$date"
,
"$project" :
"date" : 1,
"symbol" : 1,
"rate" : 1,
"_id" : 0
]
db.foo.aggregate(pipeline)
【讨论】:
【参考方案2】:其他几个选项
-
架构 - 创建和存储每小时摘要文档。当您添加新文档时,更新“每小时”条目。如果您想求和、求平均等,这种技术也很有效。此外,维护此摘要的开销也分摊到所有操作中。
查询 - 根据日期字段和限制 (1) 对小时范围运行查询,因为您可以处理任何行
上述管道方法的问题是查询没有优化,并且会扫描集合中的所有文档。我会在查询中添加一个日期范围以提高效率。此外,管道的硬限制为 32MB。如果您拥有的数据多于该数据,则聚合将不起作用。
【讨论】:
以上是关于Mongo,在历史收藏中每小时只挑选第一笔交易的主要内容,如果未能解决你的问题,请参考以下文章