MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Kombinieren Sie die geoNear-Abfrage mit einer anderen Abfrage für einen Wert

Solange Ihr MongoDB-Server aktuell genug ist und eine Version von 2.6 oder höher ist, wurde diese Funktionalität tatsächlich in die allgemeine Abfrage-Engine verschoben. Die Mongoose-Methode umschließt hier den .runCommand() Formular, das für alle zukünftigen Versionen als veraltet gilt, es muss also nur eine Standardabfrage mit zusätzlichen Operatoren platziert werden.

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

Weitere Optionen finden Sie unter $nearSphere oder andere Operatoren für Optionen. Der Hauptunterschied hier ist $maxDistance ist in Metern angegeben, wenn ein GeoJSON-Formular verwendet wird, und nicht im Bogenmaß, wo es sonst der Fall ist.

Es gibt natürlich auch den $geoNear Operator für die Aggregationspipeline. Dies ist ab MongoDB 2.4 verfügbar und kann andere Optionen wie eine "Abfrage" verwenden, um die Ergebnisse weiter einzugrenzen. Der andere mögliche Vorteil besteht darin, dass ein Feld in Ihre Ergebnisse "projiziert" wird, das die "Entfernung" vom Abfragepunkt darstellt. Dies kann in anderen Berechnungen oder benutzerdefinierten Sortierungen verwendet werden:

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

Andere zu beachtende Unterschiede bestehen darin, dass die Ergebnisse im Standard-Abfrageformular nicht mehr auf 100 Dokumente beschränkt sind, wie dies im "Befehls"-Formular der Fall ist. Die Aggregation $geoNear standardmäßig auf 100 Dokumente als Ergebnisse begrenzt, aber die Anzahl der zurückgegebenen Dokumente kann mit einer zusätzlichen "Limit"-Option für den Pipeline-Befehl eingestellt werden. Die aggregierte Anweisung "sortiert" die Ergebnisse nicht anders als von der maximalen Anzahl von Dokumenten, die von der Suche zurückgegeben werden sollen, sind die besten Ergebnisse unter den gegebenen Bedingungen, aber sie werden nicht der Reihe nach zurückgegeben, daher müssten Sie sie wie gezeigt sortieren.

In beiden Fällen sollten Sie Ihren Code verschieben, um eines dieser Formulare zu verwenden, da das Befehlsformular als veraltet gilt und in Zukunft entfernt wird. Ob die Mungo-API ihre Methode als "Wrapper" für eines dieser Formulare beibehält, ist unbekannt, aber größtenteils unwahrscheinlich, daher ist es besser, bei den unterstützten Formularen zu bleiben.