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".