La parola chiave è sphere
per distinguere tra $near
e $nearSphere
.
Come saprai, $nearSphere
si dice per calcolare la distanza usando la geometria sferica. Questo è correlato alla proiezione della mappa
della Terra (distorsione
). Dove Indici MongoDB 2d
si basa su cartesiano
e Indici MongoDB 2dsphere
si basa su Geodesic
.
Basta teoria, usiamo alcuni esempi. Diciamo che abbiamo due documenti come di seguito:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
Il manuale per entrambi gli operatori specifica che possiamo utilizzare:
2dsphere
indice per i dati sulla posizione definiti come GeoJSON punti2d
indice per i dati sulla posizione definiti come coppie di coordinate legacy
Indice: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 questo caso, entrambe le query restituiranno lo stesso risultato, perché l'indice è archiviato in 2dsphere
.
Risultato:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Indice:2d , Query:coordinate legacy
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
È qui che avviene la distinzione, il risultato per $nearSphere
è calcolato in modo sferico nonostante l'indice, mentre $near
è calcolato in proiezione piatta.
Risultato:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Vedi gist:script di test JS dell'esempio sopra. Questo è stato testato utilizzando MongoDB v3.4.4.
Vedi anche Indici geospaziali e query .