Nøgleordet er sphere
for at skelne mellem $near
og $nearSphere
.
Som du ved, $nearSphere
angives at beregne afstand ved hjælp af sfærisk geometri. Dette er relateret til jordens kortprojektion
(forvrængning
). Hvor MongoDB 2d indekserer
er baseret på kartesisk
og MongoDB 2dsphere-indekser
er baseret på Geodesic
.
Nok teori, lad os bruge nogle eksempler. Lad os sige, at vi har to dokumenter som nedenfor:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Manualen til begge operatører angiver, at vi kan bruge:
2dsphere
indeks for placeringsdata defineret som GeoJSON point2d
indeks for lokationsdata defineret som legacy koordinatpar
Indeks:2dsphere , Forespørgsel: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 ]}}}});
I dette tilfælde vil begge forespørgsler returnere det samme resultat, fordi indekset er gemt i 2dsphere
.
Resultat:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Indeks:2d , Forespørgsel:Ældre koordinater
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Det er her forskellen sker, resultatet for $nearSphere
beregnes sfærisk på trods af indekset, mens $near
beregnes i flad projektion.
Resultat:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Se resistens:JS-testscript af ovenstående eksempel. Dette blev testet ved hjælp af MongoDB v3.4.4.
Se også Geospatiale indekser og forespørgsler .