使用 $near 和 2d 索引的 Mongo 地理定位不准确

Posted

技术标签:

【中文标题】使用 $near 和 2d 索引的 Mongo 地理定位不准确【英文标题】:Mongo geolocation using $near and 2d index not being accurate 【发布时间】:2013-05-19 14:50:37 【问题描述】:

我编写了一个应用程序,它可以查找本地机构并通过 RESTful API 提供它们。我的堆栈是:快递、快递资源和猫鼬。这是我的模型示例:

var PlaceSchema = new mongoose.Schema(
    
        name: 
            type: String,
            required: true
        ,
        geolocation: 
            lat: Number,
            lng: Number
        ,
        address: 
            type: String
        
    
);
PlaceSchema.index(
    geolocation: '2d'
);

我检查了几次,我的 lon/lat 值已正确存储在数据库中,因此没有任何数据错误。

然后我运行查询以获取具有特定查询值的数据:

mongoose.connection.db.executeDbCommand(
    
        geoNear: 'places',
        near: [
            parseFloat(req.body.lat),
            parseFloat(req.body.lng)
        ],
        num: limit,
        query: 
            // Some additional queries that
            // don't impact the geo results.
        ,
        spherical: true,
        distanceMultiplier: 6371, // converting results to km
        maxDistance: distance / 6371,
    ,
    function(err, result)
    
        res.send(200, 
            status: true,
            data:   theaters
        );
    
);

它返回的结果存在一些问题:a) 以 km 为单位的计算真的错误。在大多数情况下,会有 6 到 7 公里的差异,但会有所不同,b) 距离较近的地方比其他地方看起来更远。

我使用的是直接 mongoose 查询,因为它会返回计算出的距离(我的 API 返回需要该距离)。切换到 mongoose find 方法显然不会让我访问这些数据。

想知道我的索引是否有误?它应该是 2dsphere 吗?这方面的文档有点混乱,但我看到的大多数示例都只使用 2d。

非常感谢!

【问题讨论】:

【参考方案1】:

无论您在 MongoDB 中使用哪种类型的地理空间索引,您始终必须先存储经度,然后再存储纬度。

来自http://docs.mongodb.org/manual/core/2d/#store-points-on-a-2d-plane 和文档中的多个其他地方:

无论是作为数组还是文档,如果使用经纬度, 按以下顺序存储坐标:经度、纬度。

【讨论】:

唯一的其他建议是先在命令行中尝试此操作,然后再在代码中尝试。您使用的是哪个版本的 MongoDB,这对于正确答案非常重要。 版本无关紧要。 MongoDB 中的坐标总是先指定经度。 不必在 2.2 及之前的版本中 - 如果您只使用 2d 索引 不,2.4 与 2d 索引兼容 - 它还提供 2dsphere 索引,需要相同的 long/lat 顺序。 是的,但 2.2 不需要该顺序,除非您进行球体计算。

以上是关于使用 $near 和 2d 索引的 Mongo 地理定位不准确的主要内容,如果未能解决你的问题,请参考以下文章

使用 2d 索引,与 $geoNear 聚合

geoNear查询 near查询的升级版

Mongodb $near 查询 120 万份文档耗时 6 秒

mongdb索引

Mongo突然忽略大集合中的索引

在猫鼬中使用 $near 查询明智地获取数据位置时出错