La requête correcte à utiliser ici utilise le framework d'agrégation
qui a le $geoNear
phase de pipeline pour aider à cela. C'est aussi le seul endroit où vous pouvez "trier" par plusieurs clés, comme malheureusement le "géospatial" $nearSphere
n'a pas de "méta" projection pour la "distance" comme $text
a un "score".
Aussi le geoNear
la commande de base de données que vous utilisez ne peut pas non plus être utilisée avec "cursor" .sort()
de cette façon non plus.
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 }
])
C'est l'équivalent de ce que vous essayez de faire.
Avec le cadre d'agrégation, vous utilisez les "opérateurs de pipeline"
au lieu de "modificateurs de curseur" pour faire des choses comme $sort
, $skip
et $limit
. Ces éléments doivent également être dans un ordre logique, alors que les modificateurs de curseur fonctionnent généralement.
C'est un "pipeline", tout comme "unix pipe". |
Soyez également prudent avec "maxDistance" et "distanceMuliplier". Puisque vos coordonnées sont dans des "paires de coordonnées héritées" et non GeoJSON
format, alors les distances sont mesurées en "radians". Si vous avez des données de localisation stockées en GeoJSON, le résultat est renvoyé en "mètres".