Het sleutelwoord is sphere
om onderscheid te maken tussen $near
en $nearSphere
.
Zoals u weet, $nearSphere
wordt vermeld om afstand te berekenen met behulp van sferische geometrie. Dit is gerelateerd aan de Earth kaartprojectie
(vervorming
). Waar MongoDB 2d-indexen
is gebaseerd op Cartesian
en MongoDB 2dsphere-indexen
is gebaseerd op Geodesic
.
Genoeg theorie, laten we wat voorbeelden gebruiken. Laten we zeggen dat we twee documenten hebben, zoals hieronder:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
De handleiding voor beide operators specificeert dat we kunnen gebruiken:
2dsphere
index voor locatiegegevens gedefinieerd als GeoJSON punten2d
index voor locatiegegevens gedefinieerd als oude coördinatenparen
Index:2dsphere , Query: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 dit geval zullen beide zoekopdrachten hetzelfde resultaat opleveren, omdat de index is opgeslagen in 2dsphere
.
Resultaat:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Index:2d , Zoekopdracht:oude coördinaten
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Hier vindt het onderscheid plaats, het resultaat voor $nearSphere
wordt ondanks de index sferisch berekend, terwijl $near
wordt berekend in vlakke projectie.
Resultaat:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Zie gist:JS-testscript van bovenstaand voorbeeld. Dit is getest met MongoDB v3.4.4.
Zie ook Geospatial-indexen en -query's .