Słowo kluczowe to sphere
rozróżniać $near
i $nearSphere
.
Jak wiesz, $nearSphere
mówi się, aby obliczyć odległość za pomocą geometrii sferycznej. Jest to związane z projekcją mapy
Ziemi (zniekształcenie
). Gdzie indeksy MongoDB 2d
jest oparty na kartezjańskim
i Indeksy MongoDB 2dsphere
jest oparty na Geodezji
.
Dość teorii, użyjmy kilku przykładów. Załóżmy, że mamy dwa dokumenty, jak poniżej:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Instrukcja dla obu operatorów określa, że możemy użyć:
2dsphere
indeks danych lokalizacji zdefiniowanych jako GeoJSON punkty2d
indeks danych lokalizacji zdefiniowanych jako starsze pary współrzędnych
Indeks:2dsphere , zapytanie: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 ]}}}});
W takim przypadku oba zapytania zwrócą ten sam wynik, ponieważ indeks jest przechowywany w 2dsphere
.
Wynik:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Indeks:2d , zapytanie:współrzędne starsze
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Tutaj następuje rozróżnienie, wynik dla $nearSphere
jest obliczany sferycznie pomimo indeksu, natomiast $near
obliczana jest w rzucie płaskim.
Wynik:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Zobacz gist:skrypt testowy JS z powyższego przykładu. Zostało to przetestowane przy użyciu MongoDB v3.4.4.
Zobacz też Indeksy i zapytania geoprzestrzenne .