我在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 :(得分:0)
知道“太久”是多长时间是有用的,因为这可能是高度相对的。它还可以帮助您了解您正在运行的版本,以及您正在运行的硬件类型。
但鉴于您上面提供的信息,您的
可能会减速collection.EnsureIndex(IndexKeys.GeoSpatial("PlacePoint"));
看起来你可能在每次查询之前运行它,这可能是禁忌,因为你应该只在你的集合上创建一次索引,我猜这可能会减慢你的速度。
您可以尝试从mongo 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 - 数据集由相当小的文档组成,包括lat / lon点+少量附加数据):
"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#驱动程序的任何低效率造成的。