Mongodb Mongo,在历史收藏中每小时只挑选第一笔交易

Mongodb Mongo,在历史收藏中每小时只挑选第一笔交易,mongodb,summarization,bigdata,Mongodb,Summarization,Bigdata,我的收藏包含一段时间内的货币汇率。我希望显示一个图表,每小时只需要知道一个值。然而,我的数据要密集得多,大约每秒有一条记录 如何降低每小时只留下一条记录的密度。我不需要平均,每小时的任何记录都足够了 { "_id" : ObjectId("52112613b45b5d057589009e"), "date" : ISODate("2013-08-18T19:52:51.873Z"), "rate" : 0.00007382007912027975, "symbol

我的收藏包含一段时间内的货币汇率。我希望显示一个图表,每小时只需要知道一个值。然而,我的数据要密集得多,大约每秒有一条记录

如何降低每小时只留下一条记录的密度。我不需要平均,每小时的任何记录都足够了

{
    "_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"
}
请在回答时考虑性能


谢谢。

可以使用聚合框架,虽然如果你真的关心性能,你可能应该考虑将历史记录保存在预聚集的集合中。 如果您可以使用每小时第一次以外的记录,则可以省略
$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)

还有几个其他的选择

  • 模式-创建并存储每小时一次的摘要文档。添加新文档时,请更新“小时”条目。如果您想求和、求平均值等,此技术也非常有效。维护此摘要的开销也会分摊到所有操作中
  • 查询-基于日期字段和限制(1)运行小时范围的查询,因为您对任何行都没有问题
  • 上述管道方法的问题是查询没有优化,将扫描集合中的所有文档。我会在查询中添加一个日期范围,以提高效率。此外,管道的硬限制为32MB。如果您拥有的数据超过该值,则聚合将无法工作