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)
还有几个其他的选择