MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Geonear trier par distance et temps

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