MongoDB分组大型结果性能问题

时间:2018-12-07 11:02:23

标签: mongodb aggregation-framework

我有一个查询,该查询按分钟对结果进行分组并将其发回。

查询有效但很慢(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}}


    ])

0 个答案:

没有答案