0

我用 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 个位置......这需要的时间太长了。我怎样才能让它变得更好

4

1 回答 1

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 - 数据集由相当小的文档组成,其中包括纬度/经度点 + 少量附加数据):

    "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# 驱动程序的任何低效率。

于 2013-03-06T21:21:53.173 回答