2016-07-04 25 views
1

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

正方形代表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]}} 
      } 
      } 
    ] 
    ) 

有没有一种方法,我可以优化$组或$匹配阶段? 我已经在nodeLoc(2dsphere)和t上创建了一个复合索引,但我没有看到任何改进。

编辑:

我删除索引,但执行查询保持相同的时间。

回答

1

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

对我来说,唯一可能的想法是减少匹配条件以在较小的数据集上操作并在应用程序中汇总最终结果。

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

对此有任何意义吗?

欢迎任何评论!

+0

我想避免这种情况。我可能有一千天,所以我怀疑它是有效的,也是一天可以有多达十万个文件。 – SwissFr

+0

我找到了一个权衡,我用查找和排序做了4个单独的查询。例如: cursor = GPSData.find({“nodeLoc”:{“$ geoWithin”:{“$ geometry”:square}},“t”:{“$ gt”:tMin,“$ lt”: tMax}})。sort(“nodeLoc.coordinates.1”,pymongo.ASCENDING).limit(1) 我整体下降到2秒:D – SwissFr

+0

其实我的代码执行几次后,现在需要7秒(???) – SwissFr