sql >> Databasteknik >  >> NoSQL >> MongoDB

kombinera geoNear-fråga med en annan fråga för ett värde

Så länge din MongoDB-server är ny nog, eftersom den är en version av 2.6 eller senare, har denna funktionalitet faktiskt flyttats till den allmänna frågemotorn. Mongoosemetoden här omsluter .runCommand() formulär som anses vara föråldrat för alla framtida utgåvor, så det är bara en fråga om att placera en standardfråga med ytterligare 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 ytterligare alternativ på $nearSphere eller andra operatörer för alternativ. Den största skillnaden här är $maxDistance är i meter när en GeoJSON-form används, snarare än radianer där annars.

Det finns naturligtvis också $geoNear operatör för aggregeringspipelinen. Detta är tillgängligt från och med MongoDB 2.4 och kan ta andra alternativ som en "fråga" för att begränsa resultaten ytterligare. Den andra möjliga fördelen här är att det kommer att "projicera" ett fält i dina resultat som representerar "avståndet" från frågepunkten. Detta kan användas i andra beräkningar eller anpassad 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
    }
);

Andra skillnader att notera är att i standardformuläret för frågeformulär är resultaten inte längre begränsade till 100 dokument eftersom de är i "kommando"-formuläret. Aggregeringen $geoNear begränsar till 100 dokument som resultat som standard, men antalet returnerade dokument kan ställas in med ett extra "limit"-alternativ till pipeline-kommandot. Den aggregerade satsen "sorterar" inte resultaten annat än från de maximala dokumenten att returnera från sökningen är de bästa resultaten givet villkoren, men de returneras inte i ordning, så du skulle behöva sortera dem som visas.

I båda fallen bör du flytta din kod för att använda någon av dessa formulär eftersom kommandoformuläret anses föråldrat och kommer att tas bort i framtiden. Huruvida mongoose API behåller sin metod som ett "omslag" för en av dessa former är okänt, men mestadels osannolikt, så det är bättre att hålla fast vid de stödda formerna.



  1. Ta bort ett fält från alla element i array i mongodb

  2. Mongod error (installerat med homebrew)

  3. Hur kan jag lagra bilder i mongodb med node.js?

  4. MongoDB version 2.6 misslyckas fortfarande med 2dsphere geoindexering med hänvisning till oförmåga att extrahera geonycklar och möjlig felaktig geometri