MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

No Mongo, qual é a diferença entre $near e $nearSphere?


A palavra-chave é sphere para diferenciar entre $near e $nearSphere .

Como você sabe, $nearSphere é indicado para calcular a distância usando geometria esférica. Isso está relacionado à projeção do mapa da Terra (distorção ). Onde índices MongoDB 2d é baseado em Cartesiano e índices MongoDB 2dsphere é baseado em Geodesic .

Chega de teoria, vamos usar alguns exemplos. Digamos que temos dois documentos como abaixo:
db.map.insert({ "_id": "Westfield London", "location": [ -0.22157, 51.507176 ] });
db.map.insert({ "_id": "Green Lanes Shopping Centre", "location": [ -0.098092, 51.576198 ] });

O manual para ambos os operadores especifica que podemos usar:

Í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 ]}}}});

Nesse caso, ambas as consultas retornarão o mesmo resultado, pois o índice está armazenado em 2dsphere .

Resultado:
[ /* $nearSphere */
    {"_id" : "Westfield London"},
    {"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
    {"_id" : "Westfield London"},
    {"_id" : "Green Lanes Shopping Centre"}
]

Índice:2d , Consulta:coordenadas herdadas
db.map.createIndex({"location": "2d"});

db.map.find({"location":{"$nearSphere":[ -0.127748, 51.507333 ]}});

db.map.find({"location":{"$near":[ -0.127748, 51.507333 ]}});

É aqui que a distinção acontece, o resultado para $nearSphere é calculado esfericamente apesar do índice, enquanto $near é calculado em projeção plana.

Resultado:
[ /* $nearSphere */
    {"_id" : "Westfield London"},
    {"_id" : "Green Lanes Shopping Centre"}
]
[ /* $near */
    {"_id" : "Green Lanes Shopping Centre"},
    {"_id" : "Westfield London"}
]

Consulte gist:script de teste JS do exemplo acima. Isso foi testado usando o MongoDB v3.4.4.

Consulte também Índices e consultas geoespaciais .