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

Ordinamento geonear per distanza e tempo

La query corretta da utilizzare qui utilizza il framework di aggregazione che ha il $geoNear fase di pipeline per aiutare con questo. È anche l'unico posto in cui puoi "ordinare" in base a più chiavi, come purtroppo il "geospaziale" $nearSphere non ha una proiezione "meta" per "distanza" come $text ha un "punteggio".

Anche il geoNear Il comando database che stai utilizzando non può essere utilizzato nemmeno con "cursor" .sort() anche in questo modo.

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

Questo è l'equivalente di quello che stai cercando di fare.

Con il framework di aggregazione utilizzi gli "operatori di pipeline" invece di "modificatori del cursore" per fare cose come $sort , $skip e $limit . Anche questi devono essere in un ordine logico, mentre i modificatori del cursore generalmente lo risolvono.

È una "pipeline", proprio come "Unix pipe". |

Inoltre, fai attenzione con "maxDistance" e "distanceMuliplier". Poiché le tue coordinate sono in "coppie di coordinate legacy" e non in GeoJSON formato, quindi le distanze sono misurate in "radianti". Se disponi di dati sulla posizione archiviati da GeoJSON, il risultato viene restituito in "metri".