sql >> Database teknologi >  >> NoSQL >> MongoDB

kombinere geoNear-forespørgsel med en anden forespørgsel for en værdi

Så længe din MongoDB-server er ny nok, da den er en version af 2.6 eller nyere, er denne funktionalitet faktisk blevet flyttet til den generelle forespørgselsmotor. Mongoose-metoden her ombryder .runCommand() formular, som anses for forældet for alle fremtidige udgivelser, så det er bare et spørgsmål om at placere en standardforespørgsel med yderligere operatører.

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

Se yderligere muligheder på $nearSphere eller andre operatører for muligheder. Den største forskel her er $maxDistance er i meter, når der bruges en GeoJSON-form, i stedet for radianer, hvor ellers.

Der er selvfølgelig også $geoNear operatør for aggregeringsrørledningen. Dette er tilgængeligt fra MongoDB 2.4 og kan tage andre muligheder såsom en "forespørgsel" for at indsnævre resultater yderligere. Den anden mulige fordel her er, at den vil "projicere" et felt ind i dine resultater, der repræsenterer "afstanden" fra forespørgselspunktet. Dette kan bruges i andre beregninger eller tilpasset sortering:

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

Andre forskelle at bemærke er, at i standardforespørgselsformularen er resultaterne ikke længere begrænset til 100 dokumenter, da de er i "kommando"-formen. Aggregeringen $geoNear begrænser til 100 dokumenter som resultater som standard, men antallet af dokumenter, der returneres, kan justeres med en ekstra "limit"-indstilling til pipeline-kommandoen. Den samlede erklæring "sorterer" ikke resultaterne ud fra de maksimale dokumenter, der skal returneres fra søgningen, er de øverste resultater givet betingelserne, men de returneres ikke i rækkefølge, så du skal sortere dem som vist.

I begge tilfælde bør du flytte din kode for at bruge en af ​​disse formularer, da kommandoformularen betragtes som forældet og vil blive fjernet i fremtiden. Hvorvidt mongoose API beholder sin metode som en "indpakning" for en af ​​disse former er ukendt, men for det meste usandsynligt, så det er bedre at holde sig til de understøttede former.



  1. Hvad er den korrekte måde at indstille et mongodb replika sæt ved hjælp af docker og fig?

  2. MongoClient Class vs. MongoDB\Driver\Manager Class

  3. Begræns antallet af værdier i et felt ved hjælp af MongoDB

  4. MongoDB $toString