Klíčové slovo je sphere
rozlišovat mezi $near
a $nearSphere
.
Jak víte, $nearSphere
je uvedeno pro výpočet vzdálenosti pomocí sférické geometrie. To souvisí s projekcí mapy
Země (zkreslení
). Kde indexy MongoDB 2d
je založeno na kartézštině
a indexy MongoDB 2dsphere
je založeno na Geodesic
.
Dost teorie, použijeme několik příkladů. Řekněme, že máme dva níže uvedené dokumenty:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Manuál pro oba operátory uvádí, že můžeme použít:
2dsphere
index pro údaje o poloze definovaný jako GeoJSON body2d
index pro údaje o poloze definovaný jako starší páry souřadnic
Index:2dsphere, dotaz: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 ]}}}});
V tomto případě oba dotazy vrátí stejný výsledek, protože index je uložen v 2dsphere
.
Výsledek:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Index:2d , dotaz:starší souřadnice
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Zde dochází k rozdílu, což je výsledek pro $nearSphere
se počítá sféricky navzdory indexu, zatímco $near
se počítá v ploché projekci.
Výsledek:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Viz shrnutí:testovací skript JS z výše uvedeného příkladu. Toto bylo testováno pomocí MongoDB v3.4.4.
Viz také Geoprostorové indexy a dotazy .