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,在历史收藏中每小时只挑选第一笔交易的主要内容,如果未能解决你的问题,请参考以下文章

Facebook币Libra学习-3.小试牛刀第一笔交易

有没有办法在 SQL 中每分钟只选择第一项?

BIP152介绍

永不消逝的数字收藏品 记录历史 传承记忆

永不消逝的数字收藏品 记录历史 传承记忆

永不消逝的数字收藏品 记录历史 传承记忆