web-dev-qa-db-fra.com

MongoDB 'incapable de trouver l'index pour la requête $ geoNear'

J'essaie simplement de faire fonctionner une simple requête near. Voici un échantillon de mon document.

{"point": 
  {"type": "Point", 
     "coordinates": [30.443902444762696, -84.27326978424058]}, 
   "created_on": {"$date": 1398016710168}, 
   "radius": 180, 
   "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
   "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
   "expires_on": {"$date": 1399831110168}
}

et avec Mongod j'ai essayé la commande:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}});

mais j'obtiens cette erreur:

erreur: { "$ err": "Impossible d'exécuter la requête: requête de traitement d'erreur: ns = foo.bar skip = 0\nTree: champ GEONEAR = point maxdist = 1.79769e + 308 isNearSphere = 0 || Premier: notFirst: chemin complet: point\nSort: {}\nProj: {}\n le planificateur a renvoyé l'erreur: impossible de trouver l'index pour la requête $ geoNear ", "code": 17007 }

Peut-être que mon google-fu n'est pas aussi précis aujourd'hui mais je n'ai rien trouvé. De plus, j'ai exécuté la commande Ensure Index. Mon intention est que ce soient des emplacements de carte.

db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});
29
frankV

Peu de problèmes, vous avez créé vos index sur la collection foo de la base de données foo, mais interrogez la collection bar. Vous devez être sur la bonne collection.

En lisant le document que vous avez inséré, vous devez ajouter un index "2dsphere" pour supporte les objets geoJson . Cet index doit être sur l'élément "point" de vos documents, alors essayez

db.bar.createIndex({point:"2dsphere"});

Vous pouvez ensuite interroger comme suit en fournissant un obj geoJson pour la requête:

db.bar.find(
   { point :
       { $near :
          {
            $geometry : {
               type : "Point" ,
               coordinates : [-84.27326978424058, 30.443902444762696] },
            $maxDistance : 1
          }
       }
    }
)
61
daveh
db.prod.createIndex({ "location": "2d" })

Ceci résolu pour le même problème pour moi.

Où prod est mon nom de collection et emplacement est le nom de la colonne qui stocke l'emplacement géographique (GeoPoint)

On peut trouver quelques discussions à propos de la même chose ici

7
Krish Nakum R

Donc, il semble y avoir quelques fausses choses ici:

  • À partir des données que vous affichez et de vos informations de requête, les informations pertinentes sont contenues sous le point de champ et au format GeoJSON. Votre création d'index:
 db.foo.createIndex ({geo: "2d"}) 

N'échoue pas car il n'y a pas actuellement de champ appelé "geo" et le champ avec les données aurait dû être à cet endroit. Si vous aviez utilisé «point» à la place du champ correct, vous auriez alors reçu une erreur vous indiquant que ce type d'index n'est pas valide pour les données GeoJSON. Vous avez besoin d'un index "2dsphere":

db.points.createIndex({ "point": "2dsphere" })
  • En prolongeant le même problème, là encore, les données sont au format GeoJSON et la forme de la requête est celle d’une paire de coordonnées héritée. Vous devez modifier les arguments de la requête pour que cela n'échoue plus:
 db.points.find ({point: {
 $ près: {
 $ géométrie: {
 type: "Point", coordonnées 
: [-84.26060492426588, 30.45023887165371]. } 
} 
}}) 

Voir la documentation de $near

3
Neil Lunn