2011-09-08 16 views
9

Sto riscontrando problemi nella definizione dell'indice geo spaziale '2d' come illustrato in di seguito. Qualche indizio su cosa sta andando storto?Indice spaziale geografico in mongodb con node.js

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

Getta errore come,

events.js:45 throw arguments[1]; // Unhandled 'error' event ^Error: point not in range at [object Object]. (/cygdrive/c/Personal/software/ nodejs/NODE/no de_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:503:20)

EDIT: aggiunto il codice

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) 
      }) 
+0

sembra che si sta utilizzando anche Mongoose. Hai un oggetto/query reale che stai eseguendo? Il problema potrebbe essere nel driver Node, potrebbe essere in Mongoose o potrebbe essere nel codice, quindi abbiamo bisogno di un po 'di più per andare avanti. –

+0

Sì, hai ragione. Sto usando mangusta. Ho modificato la domanda sopra e ho aggiunto il codice. salvare sta accadendo correttamente. Quando lo faccio trovo che si lamenta dell'indice e quando aggiungo l'indice, dice "point not in range" – user644745

+1

Bene, ho cambiato il nome dell'attributo da loc a "location" e ho cambiato "2d" in "2d" e sembra , sta lavorando adesso. Questo è strano. – user644745

risposta

8

E 'anche interessante notare che si vuole longitudine di venire prima di latitudine nella propria matrice. Ciò non influirà su di te quando si utilizza il 2D, ma lo sarà quando si utilizza il 3D. Matematicamente questo ha senso in quanto la longitudine è la coordinata X e la latitudine è la coordinata Y (x, y), ma la maggior parte di noi ha familiarità con lat che arriva prima (e uno dei migliori libri di Mongo là fuori ha un esempio con lat prima di lungo , ma non copre 2D).

In definitiva è probabile che tu voglia utilizzare 3D poiché i calcoli 2D non sono accurati mentre ti allontani dall'equatore.


UPDATE: È possibile che questo 2015/12/08 non è più rilevante - si rinvia docs risposte aggiornati/API

+0

Questa è una buona informazione. – user644745

+0

felice che tu l'abbia trovato utile :) A proposito, ci sono due fantastici tutorial interattivi qui (incluso uno dedicato a geo): http://www.mongly.com/ – Jordan

+0

Grazie ancora per l'informazione. Ci proverò. – user644745

0

Si consiglia qualche riferimento qui su come farlo :) E per qualcuno che viene dopo. Solo nel caso, qualcuno è interessato

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

+0

Grazie Javier. Questo è stato risolto molto tempo fa. Comunque, lo faccio come someSchema.index ({g_location: '2d'}); – user644745