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

Geonear sortiert nach Entfernung und Zeit

Die hier zu verwendende korrekte Abfrage verwendet das Aggregation Framework welches den $geoNear hat Pipeline-Phase, um dabei zu helfen. Es ist auch der einzige Ort, an dem Sie nach mehreren Schlüsseln "sortieren" können, wie unglücklicherweise der "georäumliche" $nearSphere hat keine "Meta"-Projektion für "Entfernung" wie $text hat eine "Punktzahl".

Auch die geoNear Der von Ihnen verwendete Datenbankbefehl kann auch nicht mit "cursor" .sort() verwendet werden auch nicht so.

db.paging.aggregate([
    { "$geoNear": {
        "near": [106.606033,29.575897 ],
        "spherical": true,
        "distanceField": "distance",
        "distanceMuliplier": 6371,
        "maxDistance": 1/6371
    }},
    { "$sort": { "distance": 1, "createdate": -1 } },
    { "$skip": ( 2-1 ) * 2 },
    { "$limit": 5 }
])

Das entspricht dem, was Sie zu tun versuchen.

Mit dem Aggregations-Framework verwenden Sie die "Pipeline-Operatoren" anstelle von "Cursor-Modifikatoren", um Dinge wie $sort zu tun , $skip und $limit . Auch diese müssen in einer logischen Reihenfolge sein, wohingegen die Cursor-Modifikatoren es im Allgemeinen ausarbeiten.

Es ist eine "Pipeline", genau wie "Unix-Pipe". |

Seien Sie auch vorsichtig mit "maxDistance" und "distanceMultiplier". Da sich Ihre Koordinaten in "Legacy-Koordinatenpaaren" befinden und nicht in GeoJSON Format, dann werden die Entfernungen in "Bogenmaß" gemessen. Wenn Sie Standortdaten in GeoJSON gespeichert haben, wird das Ergebnis in "Metern" zurückgegeben.