具有node.js的mongodb中的地理空间索引

时间:2011-09-08 12:01:55

标签: node.js mongodb mongoose geospatial nosql

我发现如图所示定义地理空间索引'2d'有问题 下面。关于出了什么问题的任何线索?

var Address = new Schema({
      loc           : {lat: Number,  lng: Number },
      Address       : String,
      create_date       : {type: Date, default: Date.now}
});
Address.index ({
       loc : "2d"
});

它会抛出错误,

  

events.js:45          抛出论点[1]; //未处理的'错误'事件                         ^错误:[strong>指向不在范围的[对象]   宾语]。 (/ cygdrive / c / Personal / software / nodejs / NODE / no   de_modules /猫鼬/ node_modules / mongodb的/ LIB / mongodb的/ db.js:503:20)

编辑:添加了代码

var Address = new Schema({
      type              : {type: String, enum: ['Apartment', 'House', 'Serviced Apartment'], default: 'Apartment'}, 
      loc               : {lat: Number,  lng: Number },
      Address           : String,
      create_date       : {type: Date, default: Date.now}
});

/*
Address.index ({
    loc : "2d"
});
*/

mongoose.connect('mongodb://127.0.0.1:27017/test123', function(err) {
    if (err) {
        console.log("error in mongo connection");
        throw err;
    }
    console.log("connected to mongo");
});

var RentModel = mongoose.model('Rent', Address);



socket = io.listen(app);

socket.sockets.on('connection', function(client){ 

        console.log('inside on connection');

        client.on('register', function(msg){ 
                console.log("msg.geometry.type", msg.geometry.type);

                var rent = new RentModel();
                rent.type = 'Apartment';
                rent.loc.lat = 23;
                rent.loc.lng = 56;
                rent.Address = "LLLLLLLLIIIIIIIOOOOOOONNNNNNNN"

                console.log("before save");
                rent.save(function(err){
                    console.log("rent.save start");
                    if(err) { 
                        throw err; 
                        console.log("error in save");
                    }
                    console.log("saved");

                });

            }); 


            RentModel.find({loc : { $near : [20, 50], $maxDistance: 30 }} , function(err, docs){
                if (err) {
                    console.log("error in finding near", err);
                    throw err;
                }
                console.log('docs.length : ' , docs.length);
                console.log('docs : ',docs)
            })

2 个答案:

答案 0 :(得分:9)

值得注意的是,您需要经度才能在阵列中的纬度之前。当您使用2D时,这不会影响您,但是当您使用3D时它将会影响您。数学上这是有道理的,因为经度是X坐标,而纬度是Y坐标(x,y),但是我们大多数人都熟悉不久之前的lat(而且最好的Mongo书之一有一个lat的例子不久,但它不包括2D)。

最终你可能会想要使用3D,因为当你离开赤道时,2D计算并不准确。


更新时间:2015-12-08 上述内容已不再适用 - 请参阅更新的答案/ API文档

答案 1 :(得分:0)

你可能想要一些关于如何做的参考:)以及对于追随的人。以防万一,有人感兴趣

http://www.jmanzano.es/blog/?p=592