it-swarm.com.de

MongoDB kann Index für $ geoNear-Abfrage nicht finden

Ich versuche nur, eine einfache near-Abfrage zum Laufen zu bringen. Hier ist ein Beispiel meines Dokuments.

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

und mit mongod versuchte ich den Befehl:

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

aber ich bekomme diese Fehlermeldung:

error: { "$ err": "Abfrage kann nicht ausgeführt werden: Fehler bei der Verarbeitung: ns = foo.bar überspringen = 0\nBaum: GEONEAR-Feld = Punkt maxdist = 1.79769e + 308 isNearSphere = 0 || Zuerst: notFirst: vollständiger Pfad: Punkt\nSort: {}\nProj: {}\n Planer hat Fehler zurückgegeben: Index für $ geoNear-Abfrage konnte nicht gefunden werden ", "Code": 17007 }

Vielleicht ist mein Google Fu heute nicht so scharf, aber ich konnte nichts finden. Ich habe auch den Befehl "Sicherstellen" ausgeführt. Meine Absicht ist, dass es sich um Kartenstandorte handelt.

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

Wenige Probleme, sie haben Ihre Indizes für die FOO-Sammlung der FOO-Datenbank erstellt, fragen jedoch die Bar-Sammlung ab. Sie müssen sich in der richtigen Sammlung befinden.

Wenn Sie das eingefügte Dokument lesen, müssen Sie einen Index "2dsphere" hinzufügen, um die geoJson-Objekte zu unterstützen . Dieser Index muss sich auf das "Punkt" -Element Ihrer Dokumente beziehen. Versuchen Sie es daher

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

Sie können dann wie folgt abfragen, indem Sie ein geoJson-Objekt für die Abfrage angeben:

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

Dies löste sich für das gleiche Problem für mich.

Wo prod ist mein Sammlungsname und Ort ist der Name der Spalte, in der der Geo-Standort (GeoPoint) gespeichert ist.

Einige Diskussionen darüber finden Sie hier

7
Krish Nakum R

Es scheint also ein paar Dinge falsch zu sein:

  • Aus den angezeigten Daten und auch aus Ihren Abfrageinformationen sind die relevanten Informationen unter dem Feldpunkt und im GeoJSON-Format enthalten. Ihre Indexerstellung:
 db.foo.createIndex ({geo: "2d"}) 

Scheitert nicht, da es derzeit kein Feld mit dem Namen "Geo" gibt und das Feld mit den Daten an diesem Ort hätte sein müssen. Wenn Sie stattdessen "point" (das richtige Feld) verwendet hätten, hätten Sie eine Fehlermeldung erhalten, die besagt, dass dieser Indextyp für die GeoJSON-Daten ungültig ist. Sie benötigen einen "2dsphere" Index:

db.points.createIndex({ "point": "2dsphere" })
  • Um das gleiche Problem zu beheben, haben die Daten wiederum das GeoJSON-Format, und die Abfrageform ist die eines alten Koordinatenpaares. Sie müssen die Abfrageargumente so ändern, dass sie nicht mehr fehlschlägt:
 db.points.find ({Punkt: {
 $ in der Nähe: {
 $ Geometrie: {
 Typ: "Point", 
 Koordinaten: [-84.26060492426588, 30.45023887165371] 
 } 
} 
}}) 

Siehe die Dokumentation zu $near

3
Neil Lunn

Zusätzlich zu den obigen Antworten können Sie Folgendes ausführen, wenn Sie bereits versucht haben, einen Index zu erstellen und Syntax- oder Feldfehler festgestellt haben

db.<yourcollection>.dropIndexes(); Bereinigt alle Indizes und erstellt sie ordnungsgemäß neu.

Außerdem sollte der Index auf dem übergeordneten Element von "Koordinaten" erstellt werden, nicht auf den Koordinaten selbst:

{
   "_id": 59ac03d168eaaa14c2a57a00",
   "location":{
      "type":"Point",
      "coordinates":[
         131.6667,
         57.8368
      ]
   },
   "age":53,
   "username":"Brandi_Greenfelder"
}

db.<yourcollection>.createIndex({ location: '2dsphere' });

Achtung, es gibt "2d" und "2dsphere", benutze die zweite als das Neue.

1
George Katsanos