Nyckelordet är sphere
för att skilja mellan $near
och $nearSphere
.
Som du vet, $nearSphere
anges beräkna avstånd med hjälp av sfärisk geometri. Detta är relaterat till jordens kartprojektion
(förvrängning
). Där MongoDB 2d indexerar
är baserad på kartesiska
och MongoDB 2dsphere-index
är baserad på Geodesic
.
Nog med teori, låt oss ta några exempel. Låt oss säga att vi har två dokument enligt nedan:
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 för båda operatörerna anger att vi kan använda:
2dsphere
index för platsdata definierad som GeoJSON poäng2d
index för platsdata definierade som legacy koordinatpar
Index:2dsphere , Fråga: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 det här fallet kommer båda frågorna att returnera samma resultat, eftersom indexet är lagrat i 2dsphere
.
Resultat:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Index:2d , Fråga:ä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 är här skillnaden sker, resultatet för $nearSphere
beräknas sfäriskt trots indexet, medan $near
beräknas i platt projektion.
Resultat:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Se Gist:JS test script av exemplet ovan. Detta testades med MongoDB v3.4.4.
Se även Geospatiala index och frågor .