Геопространственный индекс в mongodb с помощью node.js - PullRequest
10 голосов
/ 08 сентября 2011

Я обнаружил проблему при определении геопространственного индекса '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 throw arguments [1];// Необработанное событие 'error' ^ Ошибка: точка не находится в диапазоне в [объекте Object].(/ cygdrive / c / Personal / software / 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)
            })

Ответы [ 2 ]

9 голосов
/ 16 сентября 2011

Стоит также отметить, что вы хотите, чтобы долгота была выше широты в вашем массиве. Это не повлияет на вас, когда вы используете 2D, но будет, когда вы используете 3D. Математически это имеет смысл, так как долгота - это координата X, а широта - это координата Y (x, y), но большинство из нас знакомы с широтой, наступающей вскоре (и одна из лучших монгольских книг там имеет пример с широтой перед длинным , но это не распространяется на 2D).

В конечном итоге вы, вероятно, захотите использовать 3D, поскольку 2D-вычисления не точны, когда вы удаляетесь от экватора.


ОБНОВЛЕНИЕ: 2015-12-08 Вышеуказанное больше не актуально - см. Обновленные ответы / документы API

0 голосов
/ 11 сентября 2012

Возможно, вы захотите получить справку о том, как это сделать :) И для тех, кто придет после.На всякий случай кому-то интересно

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

...