Das Schlüsselwort ist sphere
um zwischen $near
zu unterscheiden und $nearSphere
.
Wie Sie wissen, $nearSphere
wird angegeben, um die Entfernung unter Verwendung der sphärischen Geometrie zu berechnen. Dies hängt mit der Kartenprojektion
der Erde zusammen (Verzerrung
). Wobei MongoDB 2d-Indizes
basiert auf Cartesian
und MongoDB 2dsphere-Indizes
basiert auf Geodesic
.
Genug Theorie, lassen Sie uns einige Beispiele verwenden. Nehmen wir an, wir haben zwei Dokumente wie folgt:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Das Handbuch für beide Operatoren gibt an, dass wir verwenden können:
2dsphere
Index für Standortdaten, definiert als GeoJSON Punkte2d
Index für Standortdaten, definiert als alte Koordinatenpaare
Index:2dsphere , Abfrage:GeoJSON
db.map.createIndex({"location": "2dsphere"});
db.map.find({"location":{"$nearSphere":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ] }}}});
db.map.find({"location":{"$near":{"$geometry":{"type":"Point", "coordinates":[ -0.127748, 51.507333 ]}}}});
In diesem Fall liefern beide Abfragen dasselbe Ergebnis, da der Index in 2dsphere
gespeichert ist .
Ergebnis:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Index:2d , Abfrage:Alte Koordinaten
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Hier erfolgt die Unterscheidung, das Ergebnis für $nearSphere
wird trotz Index sphärisch berechnet, während $near
wird in flacher Projektion berechnet.
Ergebnis:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Siehe Zusammenfassung:JS-Testskript des obigen Beispiels. Dies wurde mit MongoDB v3.4.4 getestet.
Siehe auch Geodatenindizes und -abfragen .