MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

In Mongo qual è la differenza tra $near e $nearSphere?

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:

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 .