sql >> Base de Datos >  >> NoSQL >> MongoDB

En Mongo, ¿cuál es la diferencia entre $near y $nearSphere?

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:

Í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 .