2013-02-17 70 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