2016-07-04 49 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