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:
2dsphere
índice para dados de localização definidos como GeoJSON pontos2d
índice para dados de localização definidos como pares de coordenadas herdados
Í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 .