优化使用$min和$max的mongoDB聚合

优化使用$min和$max的mongoDB聚合,mongodb,optimization,query-optimization,pymongo,Mongodb,Optimization,Query Optimization,Pymongo,我的数据库中有大约300万个文档。我使用这个查询来获取文档中包含的最小和最大纬度和经度,因为在我的应用程序中,我想放大正方形中包含的现有数据。 大约需要16秒来执行: 正方形表示4个坐标。tMin和tMax是我的时间间隔(日期) 有没有办法优化$group或$match阶段? 我已经在nodeLoc(2dsphere)和t上创建了一个复合索引,但没有看到任何改进 编辑: 我删除了索引,但执行查询的时间保持不变。组阶段不会使用索引imho,这是通过所有数据值进行的非常昂贵的扫描 对我来说,唯一可能

我的数据库中有大约300万个文档。我使用这个查询来获取文档中包含的最小和最大纬度和经度,因为在我的应用程序中,我想放大正方形中包含的现有数据。 大约需要16秒来执行:

正方形表示4个坐标。tMin和tMax是我的时间间隔(日期)

有没有办法优化$group或$match阶段? 我已经在nodeLoc(2dsphere)和t上创建了一个复合索引,但没有看到任何改进

编辑:


我删除了索引,但执行查询的时间保持不变。

组阶段不会使用索引imho,这是通过所有数据值进行的非常昂贵的扫描

对我来说,唯一可能的想法是减少匹配标准,以便在较小的数据集上操作,并在应用程序中聚合最终结果

如果我们有,比如说从
tMin
tMax
开始的5天-通过在5轮中运行查询可以实现更快的响应。最后进行数组合并并扫描20个数组条目上的最小值和最大值

这对你有意义吗


欢迎评论

我想避免这种情况。我可能有一千天,所以我怀疑它是否有效,而且一天最多可以有十万个文档。我找到了一个折衷办法,我用find和sort分别进行了4次查询。例如:cursor=GPSData.find({“nodeLoc”:{“$geoin”:{“$geometry”:square},,“t”:{“$gt”:tMin,$lt”:tMax})。sort(“nodeLoc.coordinates.1”,pymongo.sunsing)。limit(1)我的总时间减少到了2秒:实际上,在执行了几次代码之后,现在需要7秒(?)我发现,当需要在矩形内查找坐标时,$geointen是次优的。如果lat>minLat,lat 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]}} } } ] )