Contanto que seu servidor MongoDB seja recente o suficiente, sendo uma versão 2.6 ou superior, essa funcionalidade foi movida para o mecanismo de consulta geral. O método mangusto aqui envolve o
.runCommand()
form que é considerado obsoleto para todas as versões futuras, portanto, é apenas uma questão de colocar uma consulta padrão com operadores adicionais. GeoLocation.find({
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"$maxDistance": distanceInMeters
},
"loc.type": "Point"
},function(err,docs) {
// The documents are also mongoose document objects as well
});
Veja mais opções em
$nearSphere
ou outros operadores para opções. A principal diferença aqui é $maxDistance
está em metros quando um formulário GeoJSON é usado, em vez de radianos, caso contrário. É claro que também existe o
$geoNear
operador para o pipeline de agregação. Isso está disponível a partir do MongoDB 2.4 e pode ter outras opções, como uma "consulta", para restringir ainda mais os resultados. A outra vantagem possível aqui é que ele "projetará" um campo em seus resultados representando a "distância" do ponto de consulta. Isso pode ser usado em outros cálculos ou classificação personalizada:GeoLocation.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
},
"distanceField": "distance",
"maxDistance": distanceInMeters,
"spherical": true,
"query": { "loc.type": "Point" }
}},
{ "$sort": { "distance": -1 } } // Sort nearest first
],
function(err,docs) {
// These are not mongoose documents, but you can always cast them
}
);
Outras diferenças a serem observadas são que no formulário de consulta padrão os resultados não estão mais limitados a 100 documentos, pois estão no formulário de "comando". A agregação
$geoNear
limita a 100 documentos como resultados por padrão, mas o número de documentos retornados pode ser ajustado com uma opção "limite" adicional para o comando pipeline. A instrução agregada não "classifica" os resultados que não sejam do máximo de documentos a serem retornados da pesquisa são os principais resultados dadas as condições, mas eles não são retornados em ordem, portanto, você precisa classificá-los conforme mostrado. Em ambos os casos, você deve mover seu código para usar qualquer um desses formulários, pois o formulário de comando é considerado obsoleto e será removido no futuro. Se a API do mangusto mantém seu método como um "wrapper" para um desses formulários é desconhecido, mas é improvável, então é melhor ficar com os formulários suportados.