1

我编写了一个应用程序来查找本地机构并通过 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)以公里为单位的计算确实是错误的。在大多数情况下,有 6-7 公里的差异,但它会有所不同,b) 距离较近的地方比其他地方看起来更远。

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

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

非常感谢!

4

1 回答 1

9

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

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

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

于 2013-05-19T21:19:04.187 回答