2013-05-22 4 views
1

J'essaie d'obtenir des résultats de ma collection d'endroits qui sont proches d'une coordonnée. Pour ce faire, j'utilise un index 2d sur un attribut location.position qui possède un attribut lng et lat.

Le problème est que chaque coordonnée que je mets, elle renvoie les mêmes 60 résultats (la collection entière).

Les documents de ma collection sont tous proches de mes coordonnées GPS et, cependant, si je mets une coordonnée 0.0, 0.0 ou toute autre paire, elle revient toujours la même.

En fait, la requête retourne exactement la même chose si j'utilise un find vide().

L'index semble être créé correctement car il ne renvoie aucune erreur.

Un objet dans ma collection est comme ceci:

{ "_id" : "80293840923...", 
"name": "myname", 
"location" : { 
"position" : { "lng": -196988, "lat": 43.30594 } 
"address": "example", 
"city": "example" } 
} 

L'indice est créé comme ceci:

places_collection.ensureIndex({"location.position": "2d"}, {name: "index2dLocation"}, function(error, indexName){ 
    callback("", "Indice creado: " + indexName) 
}); 

La recherche serait comme ceci:

places_collection.find( 
{ "location.position" : { $near : [ parseFloat(-123.98) , parseFloat(162.342) ] } } 
).toArray(function(error, results) { 
      if(error){ callback(error, "") 
      }else{ console.log(results.length); callback(null, results); } 
}); 

Et enfin , comme dit précédemment, ma recherche retourne toujours le même résultat. Cela ne me dérange pas si je mets une coordonnée ou une autre. Même cela ne me dérange pas si je fais une recherche vide().

Toute aide ici s'il vous plaît? Je ne sais pas comment le faire fonctionner.

Merci beaucoup.

Répondre

1

Enfin, la solution était d'ajouter la propriété $maxDistance pour éviter tous les documents qui sont plus loin que le rayon dans le $maxDistance.

Si vous ne mettez pas cette propriété et que vous n'avez que 10 docs à proximité d'une coordonnée, si vous faites une recherche dans une coordonnée très éloignée, elle retournera toujours les 10 mêmes docs parce que vous n'avez plus docs près de la nouvelle coordonnée.

En outre, il est important de dire que l'unité de $maxDistance est degrés, alors voici ma solution est: https://stackoverflow.com/a/7841830/974828

Pour convertir des degrés en kilomètres, il faut diviser par 111,12.

Voici donc le résultat:

db.places.find({ loc : { $near : [50,50] , $maxDistance : 1/111.12 } }) 
Questions connexes