MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

combiner la requête geoNear avec une autre requête pour une valeur

Tant que votre serveur MongoDB est assez récent, étant une version 2.6 ou supérieure, cette fonctionnalité a en fait été déplacée vers le moteur de requête général. La méthode mangouste enveloppe ici le .runCommand() form qui est considéré comme obsolète pour toutes les versions futures, il suffit donc de placer une requête standard avec des opérateurs supplémentaires.

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

Voir d'autres options sur $nearSphere ou d'autres opérateurs pour les options. La principale différence ici est $maxDistance est en mètres lorsqu'un formulaire GeoJSON est utilisé, plutôt qu'en radians dans le cas contraire.

Il y a bien sûr aussi le $geoNear opérateur pour le pipeline d'agrégation. Ceci est disponible à partir de MongoDB 2.4 et peut prendre d'autres options telles qu'une "requête" pour affiner davantage les résultats. L'autre avantage possible ici est qu'il "projettera" un champ dans vos résultats représentant la "distance" du point de requête. Cela peut être utilisé dans d'autres calculs ou un tri personnalisé :

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

D'autres différences à noter sont que dans le formulaire de requête standard les résultats ne sont plus limités à 100 documents comme ils le sont dans le formulaire "commande". L'agrégation $geoNear limite à 100 documents comme résultats par défaut, mais le nombre de documents renvoyés peut être réglé avec une option "limit" supplémentaire à la commande pipeline. L'instruction d'agrégation ne "trie" pas les résultats autres que les documents maximum à renvoyer de la recherche sont les meilleurs résultats compte tenu des conditions, mais ils ne sont pas renvoyés dans l'ordre, vous devez donc les trier comme indiqué.

Dans les deux cas, vous devez déplacer votre code pour utiliser l'un ou l'autre de ces formulaires, car le formulaire de commande est considéré comme obsolète et sera supprimé à l'avenir. On ne sait pas si l'API Mongoose conserve sa méthode en tant que "wrapper" pour l'un de ces formulaires, mais c'est peu probable, il est donc préférable de s'en tenir aux formulaires pris en charge.