La palabra clave es sphere
para diferenciar entre $near
y $nearSphere
.
Como sabe, $nearSphere
se establece para calcular la distancia usando geometría esférica. Esto está relacionado con la proyección de mapa
de la Tierra. (distorsión
). Donde Índices 2d de MongoDB
se basa en Cartesian
y Índices de MongoDB 2dsphere
se basa en Geodésico
.
Suficiente teoría, usemos algunos ejemplos. Digamos que tenemos dos documentos como se muestra a continuación:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });
El manual de ambos operadores especifica que podemos utilizar:
2dsphere
índice para datos de ubicación definidos como GeoJSON puntos2d
índice para datos de ubicación definidos como pares de coordenadas heredados
Índice:2dsphere , Consulta: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 ]}}}});
En este caso, ambas consultas devolverán el mismo resultado, porque el índice se almacena en 2dsphere
.
Resultado:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
Índice:2d, Consulta:Coordenadas heredadas
db.map.createIndex({"location": "2d"});
db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});
db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});
Aquí es donde ocurre la distinción, el resultado de $nearSphere
se calcula esféricamente a pesar del índice, mientras que $near
se calcula en proyección plana.
Resultado:
[ /* $nearSphere */
{"_id" : "Westfield London"},
{"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
{"_id" : "Green Lanes Shopping Centre"},
{"_id" : "Westfield London"}
]
Ver gist:JS script de prueba del ejemplo anterior. Esto fue probado usando MongoDB v3.4.4.
Consulte también Índices y consultas geoespaciales .