我的数据库中有大约300万个文档。我有这个查询来获取我的文档中包含的最小和最大纬度和经度因为在我的应用程序中我想放大广场中包含的现有数据。 执行大约需要16秒:
Square代表4个坐标。 tMin和tMax是我的时间间隔(日期)。
cursor = db.collection.aggregate([
{
"$match":
{
"nodeLoc":{"$geoWithin":{"$geometry":square}}, "t": {"$gt": tMin, "$lt": tMax}
}
},
{
"$group":
{
"_id": {},
"minLat": {"$min": {"$arrayElemAt": [ "$nodeLoc.coordinates", 1]}},
"maxLat": {"$max": {"$arrayElemAt": [ "$nodeLoc.coordinates", 1]}},
"minLon": {"$min": {"$arrayElemAt": [ "$nodeLoc.coordinates", 0]}},
"maxLon": {"$max": {"$arrayElemAt": [ "$nodeLoc.coordinates", 0]}}
}
}
]
)
有没有办法可以优化$ group或$ match阶段? 我已经在nodeLoc(2dsphere)和t上创建了一个复合索引,但我没有看到任何改进。
修改
我删除了索引,但执行查询的时间保持不变。
答案 0 :(得分:1)
小组阶段不会使用索引imho,这是非常昂贵的扫描所有数据值。
对我来说唯一可能的想法是减少匹配条件以在较小的数据集上操作并在应用中汇总最终结果。
如果我们拥有,假设从tMin
和tMax
起5天 - 通过在5轮中运行查询可以实现更快的响应。最后在20个数组条目上进行数组合并并扫描最小值,最大值。
对你有意义吗?
欢迎任何评论!