【问题标题】:Geo spatial index in mongodb with node.js带有node.js的mongodb中的地理空间索引
【发布时间】:2011-11-12 22:40:06
【问题描述】:

我在定义地理空间索引“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]; // 未处理的“错误”事件 ^ 错误:点不在范围内 [object 目的]。 (/cygdrive/c/个人/软件/nodejs/NODE/no de_modules/mongoose/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)
            })

【问题讨论】:

  • 看起来你也在使用 Mongoose。您是否有正在执行的实际对象/查询?问题可能出在 Node 驱动程序中,也可能出在 Mongoose 中,也可能出在代码中,所以我们只需要多做一点。
  • 是的,你是对的。我正在使用猫鼬。我已经编辑了上面的问题并添加了代码。保存正常进行。当我发现它抱怨索引时,当我添加索引时,它说“点不在范围内”
  • 好吧,我将属性名称从 loc 更改为“location”,并将“2d”更改为“2d”,现在看来,它正在工作。这很奇怪。

标签: node.js mongodb mongoose geospatial nosql


【解决方案1】:

还值得注意的是,您希望在数组中经度位于纬度之前。这在您使用 2D 时不会影响您,但在您使用 3D 时会影响。从数学上讲,这是有道理的,因为经度是 X 坐标,纬度是 Y 坐标 (x,y),但我们大多数人都熟悉 lat 很快就会出现(并且最好的 Mongo 书籍之一有一个 lat before long 的例子,但不包括二维)。

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


更新:2015-12-08 以上不再相关 - 请参阅更新的答案/API 文档

【讨论】:

  • 很高兴你发现它很有用 :) 顺便说一下,这里有两个很棒的互动教程(包括一个专门用于地理的教程):mongly.com
  • Greg 的精彩幻灯片放映,他在 Mongo 做 GeoSpatial 的工作 ..其中一些现在可能已经过时了 - 我几个月没和 Mongo 一起工作了,但我认为这是值得的分享:bit.ly/GIGevE
  • 对于现在遇到此问题的任何人 - 现在有一个 '2dsphere' index,它使用球坐标而不是笛卡尔坐标。
【解决方案2】:

您可能希望在此处获得有关如何操作的一些参考资料:) 以及后来者。以防万一,有人感兴趣

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

【讨论】:

  • 谢谢哈维尔。这早就解决了。无论如何,我这样做 someSchema.index({ g_location : '2d' });
猜你喜欢
  • 2011-10-23
  • 2016-02-12
  • 2013-02-04
  • 2019-11-30
  • 2011-04-22
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2011-10-25
相关资源
最近更新 更多