【问题标题】:Get nearby places with mongoDB and mongoose使用 mongoDB 和 mongoose 获取附近的地方
【发布时间】:2015-09-10 12:00:36
【问题描述】:

我有一个小型数据库,其中包含手动添加的地点,我正在尝试按 minDistance 和 maxDistance 过滤它们。

这就是猫鼬模式

 var schema = new Schema({
    name: {
        type: String,
        unique: false,
        required: true
    },
    location: {
        type: [Number],  // [<longitude>, <latitude>]
        index: '2dsphere',     // create the geospatial index
        required: false // true senare
    }
});

这是获取附近地点的方法:

schema.statics.getNearby = function (longitude, latitude, minDistance, maxDistance, callback) {

    if ((longitude || latitude) === undefined) return new ModelError("location or radius is missing");

    var Places = this;
    var point = { type: "Point", coordinates: [ longitude, latitude]};
    Places.geoNear(point, { minDistance: minDistance, maxDistance : maxDistance},
        function(err, activities, stats) {
            if (err)  return callback(err);
            callback(null, activities);
    });
};

这是我执行此方法时得到的错误代码:

  500 Error
   at Error.MongoError (/home/ec2-user/bored_server/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:13:17)
   at Function.MongoError.create (/home/ec2-user/bored_server/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/error.js:31:11)
   at /home/ec2-user/bored_server/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:768:66
   at Callbacks.emit (/home/ec2-user/bored_server/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:84:3)
   at null.messageHandler (/home/ec2-user/bored_server/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:218:23)
   at Socket.<anonymous> (/home/ec2-user/bored_server/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/lib/connection/connection.js:259:22)
   at Socket.emit (events.js:95:17)
   at Socket.<anonymous> (_stream_readable.js:765:14)
   at Socket.emit (events.js:92:17)
   at emitReadable_ (_stream_readable.js:427:10)

让我烦恼的是,我可以使用 mongodb 进行这样的查询,而且效果很好。

db.places.find({ 
    location: { 
        $nearSphere : { 
            $geometry: { 
                type: "Point",  
                coordinates: [ 18, 58] }, 
                $minDistance: 0, 
                $maxDistance: 1000000 
                } 
            } 
        }
    )

编辑1: 他的解决方案是他应该以米为单位指定 maxDistance 值,我看不出这对我有什么帮助,因为无论我指定什么值作为 maxdistance,我都会得到一个错误。谢谢

【问题讨论】:

标签: javascript node.js mongodb mongoose nosql


【解决方案1】:

我找到了解决方案,minDistance 和 maxDistance 是字符串类型,对于 maxDistance 可以正常工作,但是对于 minDistance,我不得不将其转换为 float 或 int。 一个肮脏的解决方案是这个代码:

schema.statics.getNearby = function (longitude, latitude, minDistance, maxDistance, callback) {

if ((longitude || latitude) === undefined) return new ModelError("location or radius is missing");

var Places = this;
var point = { type: "Point", coordinates: [ longitude, latitude]};
Places.geoNear(point, { minDistance: parseFloat(minDistance), maxDistance : maxDistance},
    function(err, activities, stats) {
        if (err)  return callback(err);
        callback(null, activities);
});

};

现在只有在 minDistance 是字符串类型时才需要这样做。 谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2016-03-05
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多