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

combinare la query geoNear con un'altra query per un valore

Finché il tuo server MongoDB è abbastanza recente, essendo una versione 2.6 o successiva, questa funzionalità è stata effettivamente spostata nel motore di query generale. Il metodo mongoose qui avvolge .runCommand() modulo che è considerato deprecato per tutte le versioni future, quindi si tratta solo di inserire una query standard con operatori aggiuntivi.

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

Vedi ulteriori opzioni su $nearSphere o altri operatori per le opzioni. La differenza principale qui è $maxDistance è in metri quando viene utilizzato un modulo GeoJSON, anziché in radianti dove altrimenti.

C'è ovviamente anche il $geoNear operatore per la pipeline di aggregazione. Questo è disponibile a partire da MongoDB 2.4 e può richiedere altre opzioni come una "query" per restringere ulteriormente i risultati. L'altro possibile vantaggio qui è che "proietterà" un campo nei risultati che rappresenta la "distanza" dal punto della query. Questo può essere utilizzato in altri calcoli o nell'ordinamento personalizzato:

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

Altre differenze da notare sono che nel modulo di query standard i risultati non sono più limitati a 100 documenti come nel modulo "comando". L'aggregazione $geoNear limiti a 100 documenti come risultati per impostazione predefinita, ma il numero di documenti restituiti può essere ottimizzato con un'opzione "limite" aggiuntiva al comando pipeline. L'istruzione aggregata non "ordina" i risultati diversi dal numero massimo di documenti da restituire dalla ricerca sono i primi risultati date le condizioni, ma non vengono restituiti in ordine, quindi dovresti ordinarli come mostrato.

In entrambi i casi dovresti spostare il codice per utilizzare uno di questi moduli poiché il modulo di comando è considerato deprecato e verrà rimosso in futuro. Non è noto se l'API mongoose mantenga il suo metodo come "wrapper" per uno di questi moduli, ma per lo più improbabile, quindi è meglio attenersi ai moduli supportati.