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

combine la consulta geoNear con otra consulta para obtener un valor

Siempre que su servidor MongoDB sea lo suficientemente reciente, siendo una versión de 2.6 o superior, esta funcionalidad se ha movido al motor de consulta general. El método mangosta aquí envuelve el .runCommand() formulario que se considera obsoleto para todas las versiones futuras, por lo que solo es cuestión de realizar una consulta estándar con operadores adicionales.

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

Consulte más opciones en $nearSphere u otros operadores de opciones. La principal diferencia aquí es $maxDistance está en metros cuando se utiliza un formulario GeoJSON, en lugar de radianes en caso contrario.

Por supuesto, también está el $geoNear operador para la canalización de agregación. Está disponible a partir de MongoDB 2.4 y puede aceptar otras opciones, como una "consulta", para reducir aún más los resultados. La otra posible ventaja aquí es que "proyectará" un campo en sus resultados que representa la "distancia" desde el punto de consulta. Esto se puede usar en otros cálculos o clasificación 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
    }
);

Otras diferencias a tener en cuenta son que en el formulario de consulta estándar los resultados ya no están limitados a 100 documentos como lo están en el formulario de "comando". La agregación $geoNear limita a 100 documentos como resultados de forma predeterminada, pero la cantidad de documentos devueltos se puede ajustar con una opción de "límite" adicional para el comando de canalización. La declaración agregada no "ordena" los resultados que no sean la cantidad máxima de documentos que se devuelven de la búsqueda, que son los mejores resultados dadas las condiciones, pero no se devuelven en orden, por lo que deberá ordenarlos como se muestra.

En cualquier caso, debe mover su código para usar cualquiera de estos formularios, ya que el formulario de comando se considera obsoleto y se eliminará en el futuro. Se desconoce si la API de mongoose conserva su método como un "envoltorio" para uno de estos formularios, pero es poco probable, por lo que es mejor seguir con los formularios admitidos.