0

Ich habe folgendes Rekord in meinem MongoDB:

{ 
    "_id" : ObjectId("56e63313059484f212a4305f"), 
    "title" : "The video title", 
    "location" : { 
     "coordinates" : [ 
      -73.9667, 
      40.78 
     ], 
     "type" : "Point" 
    }, 
} 

Ich möchte alle Punkte in diesem genauen Standort finden können. Wenn ich schreibe:

db.videos.find({ 
    location: { 
    '$nearSphere': { 
     '$geometry': { 
     type: 'Point', 
     coordinates: [-73.9667, 40.78] 
     }, 
     '$maxDistance': 0 
    } 
    } 
})[0] 

Ich erhalte keine Ergebnisse. Wenn ich tippe:

db.videos.find({ 
    location: { 
    '$nearSphere': { 
     '$geometry': { 
     type: 'Point', 
     coordinates: [-73.9667, 40.78] 
     }, 
     '$maxDistance': 0.00001 
    } 
    } 
})[0] 

Ich bekomme das eine Ergebnis.

Ich schaute und schaute, und nirgends in den docs sagen, dass maxDistance nicht 0

Kann es sein kann?

Antwort

0

So wie Sinn machen würde, $maxDistance Satz 0 würde genauso ignoriert werden, wenn Sie die Option nicht gesetzt hatten.

Wenn Sie nach einer "genauen Übereinstimmung" suchen, dann fragen Sie einfach danach. Es ist kein $nearSphere Abfrage durch keine Beschreibung:

db.videos.find({ 
    "location.coordinates" : [ -73.9667, 40.78 ] 
}) 

Was natürlich zurückgeben, das Dokument Matching wird, dass „genaue“ Position.

Für etwas komplizierter, verwenden Sie stattdessen die Aggregation $geoNear. Er projiziert einen „Abstand“, die Sie in späteren Filterung verwenden können:

db.videos.aggregate([ 
    { "$geoNear": { 
     "near": { 
      "type": "Point", 
      "coordinates": [ -73.9667, 40.78 ] 
     }, 
     "distanceField": "distance", 
     "spherical": true 
    }}, 
    { "$match": { "distance": 0 } } 
])    

So ist die intial Pipeline-Stufe eine „Distanz“ zurückgibt und die zweite Stufe alle Ergebnisse herausfiltert, wo dieser Abstand 0 in der Tat war.

Sie sollten wirklich nur brauchen, wenn Ihre abgefragten Objekte etwas wie ein "Polygon" oder ein anderes GeoJSON-Formular wären, das nicht mit dem "exakten" Koordinaten-Array übereinstimmt.

Die allgemeine "exakte" Array-Übereinstimmung sollte für "Point" -Daten geeignet sein.

Verwandte Themen