2013-02-17 42 views
0

我添加了一個GeoNear功能的MongoDB的C#這樣的:MongoDB的C#GeoNEar緩慢

` var options = GeoNearOptions.SetMaxDistance(rangeInKm/earthRadius /* to radians */) 
                .SetSpherical(true).SetDistanceMultiplier(6378.137); 
        collection.EnsureIndex(IndexKeys.GeoSpatial("PlacePoint"));' 


MongoDB.Driver.GeoNearResult<MongoPlace> Georesults = collection.GeoNear(Query.Null, coordinates[0], coordinates[1], TakeNum,options); 

我有超過3000位數據......它的時間太長。 我該怎麼做才能做得更好

+0

你真的需要提供更多關於「太長」的細節;你究竟在測量什麼,你的服務器規格是什麼?我還建議查看在服務器上執行查詢時收集的['mongostat'](http://docs.mongodb.org/manual/reference/mongostat/)輸出。 – Stennie 2013-03-16 05:59:34

回答

0

瞭解「太長」的時間有多長,因爲這可能是高度相對的。它也可以幫助你知道你正在運行的是什麼版本,以及你正在運行什麼類型的硬件。

但考慮到這一點,你有上述信息,一個潛在的經濟放緩是你

collection.EnsureIndex(IndexKeys.GeoSpatial("PlacePoint")); 

看起來你可能正在運行的每個查詢,這將是一個沒有沒有,因爲你應該只前在你的收藏中創建一個索引一次,我想這可能會減慢你的速度。

你可以嘗試從蒙戈shell中運行你的命令,像這樣(替換您的實際值我的佔位符,當然):

db.runCommand({ geoNear: "<collectionName>", near: [<lon>,<lat>], num: <num>, spherical:true }) 

然後再看看「統計」的信息,看看是否有什麼東西那似乎有不妥之處。我個人收集了234107個具有地理空間索引的地方,並且我運行了一個geoNear命令,該命令的座標遠離我集合中的任何地方,以幫助確保它掃描每一個地方。我得到了以下結果(在適中的強大硬件上運行2.2.3版本:Core i5,16 GB RAM,7200 RPM HDD - 數據集由相當小的文檔組成,包括經緯度點+少量附加數據):

"stats" : { 
      "time" : 261, 
      "btreelocs" : 0, 
      "nscanned" : 234107, 
      "objectsLoaded" : 133, 
      "avgDistance" : 1.380670166668938, 
      "maxDistance" : 1.3807179692447809 
    }, 

的查詢,這是更接近我收藏的地方,我得到:

"stats" : { 
      "time" : 15, 
      "btreelocs" : 0, 
      "nscanned" : 6211, 
      "objectsLoaded" : 29, 
      "avgDistance" : 0.003811909711576418, 
      "maxDistance" : 0.003919781450489085 
    }, 

「時間」這裏的單位是毫秒,這似乎很合理的我。在C#中運行GeoNear函數總是立即返回給我,所以我不認爲你的緩慢結果是由於C#驅動程序的低效率造成的。

+2

如果多次調用相同的規範,[ensureIndex](http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/#db.collection.ensureIndex)命令實際上是空操作而且不應該是一個顯着的放緩(儘管重複調用肯定沒有必要)。 – Stennie 2013-03-16 05:54:53