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

combinar consulta geoNear com outra consulta para um valor


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.