我有一个查询,该查询按分钟对结果进行分组并将其发回。
查询有效但很慢(5秒),问题在于分组阶段,我在那里将所有文档分组,然后返回结果(这在60000个文档上发生)
我所需要的只是返回我声明的时间范围内的最后一个文档,这意味着:如果我在5-10分钟之间有100个文档,我只需要最后1个文档,而我不在乎所有休息。在代码中,它的简单性和快速的工作原理(我已经尝试过),问题是发送这60000个文档需要花费更多的时间进行计算,还有更好的主意如何删除此文档?
文档示例-
{
"_id" : ObjectId("5c0a23ccf5fba0234cde5d50"),
"symbol" : "test",
"sell" : 113.567,
"buy" : 113.574,
"low" : 113.385,
"high" : 113.775,
"value" : 113.5705,
"created_at" : ISODate("2018-12-07T07:39:56.384Z")}
查询-
db.getCollection('history').aggregate([
{$match: {symbol:'test', created_at: {$gte: new Date(new Date() - 1000*60*60*24*7 )}}},
{$sort:{"created_at":1}},
{
$project: {
created_at: 1,
"open": 1,
"close": 1,
"high": 1,
"low": 1,
"sell": 1,
"buy": 1,
"minutes": {
year: {$year: "$created_at"},
month: {$month: "$created_at"},
day: {$dayOfMonth: "$created_at"},
hour: {$hour: "$created_at"},
"interval": {
"$subtract": [
{"$minute": "$created_at"},
{"$mod": [{"$minute": "$created_at"}, 10]}
]
}
},
}
},
{
"$group": {
"_id": "$minutes",
"time": {"$last": "$created_at"},
"open": {"$last": "$open"},
"close": {"$last": "$close"},
"high": {"$last": "$high"},
"low": {"$last": "$low"},
"sell": {"$last": "$sell"},
"buy": {"$last": "$buy"},
}
},
{"$sort": {"_id": 1}}
])