Pregunta

Estoy encontrando un problema al definir el índice GEO espacial '2D' como se muestra a continuación. ¿Alguna pista sobre lo que está pasando mal?

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

Arroja un error como,

events.js: 45 argumentos de lanzamiento [1]; // Evento 'Error' desanimado ^ Error: punto no en el rango en [objeto objeto]. (/cygdrive/c/personal/software/nodejs/nodo/no de_modules/mongoose/node_modules/mongodb/lib/mongoDB/db.js: 503: 20)

Editar: Se agregó el código

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)
            })
¿Fue útil?

Solución

También vale la pena señalar que querrá que llegue la longitud antes de la latitud en su matriz. Esto no lo afectará cuando esté usando 2D, pero lo hará cuando esté usando 3D. Matemáticamente, esto tiene sentido ya que la longitud es la coordenada X y la latitud es la coordenada y (x, y), pero la mayoría de nosotros estamos familiarizados con Lat llegando en poco tiempo (y uno de los mejores libros de Mongo tiene un ejemplo con Lat en poco tiempo. , pero no cubre 2d).

En última instancia, es probable que quiera usar 3D, ya que los cálculos 2D no son precisos a medida que se aleja del ecuador.


Actualización: 2015-12-08 Lo anterior ya no es relevante; consulte las respuestas actualizadas/documentos de API

Otros consejos

Es posible que desee alguna referencia aquí sobre cómo hacerlo :) y para alguien que viene después. Por si acaso, alguien está interesado

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top