2011-09-08 5 views
9

Je trouve un problème dans la définition de l'index géo-spatial '2d' comme indiqué ci-dessous. Toute idée de ce qui ne va pas?Indice spatial Geo en mongodb avec node.js

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

Il jette l'erreur comme,

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: a ajouté le code

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

semble que vous aussi en utilisant mangouste. Avez-vous un objet/une requête que vous exécutez? Le problème pourrait être dans le pilote Node, il pourrait être dans Mongoose ou il pourrait être dans le code, nous avons donc besoin d'un peu plus pour continuer. –

+0

Oui, vous avez raison. J'utilise la mangouste. J'ai modifié la question ci-dessus et ajouté le code. enregistrer se passe correctement. Quand je fais une trouvaille il se plaint de l'index et quand j'ajoute l'index, il indique, "point pas dans la gamme" – user644745

+1

Eh bien, j'ai changé le nom d'attribut de loc à "emplacement" et changé "2d" en "2d" et il semble , ça marche maintenant. C'est étrange. – user644745

Répondre

8

Il est également intéressant de noter que vous voulez longitude à venir avant de latitude dans votre tableau. Cela ne vous affectera pas lorsque vous utiliserez la 2D, mais ce sera le cas lorsque vous utiliserez la 3D. Mathématiquement, cela a du sens car la longitude est la coordonnée X et la latitude est la coordonnée Y (x, y), mais la plupart d'entre nous sont familiers avec lat venir avant longtemps (et l'un des meilleurs livres Mongo a un exemple avec lat avant longtemps , mais cela ne couvre pas 2D). En fin de compte, vous allez probablement vouloir utiliser la 3D car les calculs 2D ne sont pas précis lorsque vous vous éloignez de l'équateur.


MISE À JOUR: 08/12/2015 Ce qui précède est plus pertinent - s'il vous plaît voir les réponses mises à jour/API docs

+0

Ceci est une bonne information. – user644745

+0

heureux que vous l'avez trouvé utile :) En passant, il ya deux grands tutoriels interactifs ici (y compris un dédié à la géo): http://www.mongly.com/ – Jordan

+0

Merci encore pour l'information. Je vais essayer ça. – user644745

0

Vous voudrez peut-être une référence ici sur la façon de le faire :) Et pour quelqu'un qui vient après. Juste au cas où, quelqu'un est intéressé

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

+0

Merci Javier. Cela a été résolu depuis longtemps .. De toute façon, je le fais comme someSchema.index ({g_location: '2d'}); – user644745