MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Classificação Geonea por distância e tempo


A consulta correta a ser usada aqui usa a estrutura de agregação que tem o $geoNear estágio de pipeline para ajudar com isso. É também o único lugar onde você pode "classificar" por várias chaves, como infelizmente o $nearSphere "geoespacial" não tem uma projeção "meta" para "distância" como $text tem uma "pontuação".

Também o geoNear comando de banco de dados que você está usando também não pode ser usado com "cursor" .sort() dessa forma também.
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 }
])

Isso é o equivalente do que você está tentando fazer.

Com a estrutura de agregação, você usa os "operadores de pipeline" em vez de "modificadores de cursor" para fazer coisas como $sort , $skip e $limit . Também estes devem estar em uma ordem lógica, enquanto os modificadores de cursor geralmente resolvem isso.

É um "pipeline", assim como "tubo Unix". |

Além disso, tenha cuidado com "maxDistance" e "distanceMuliplier". Como suas coordenadas estão em "pares de coordenadas herdadas" e não em GeoJSON formato, então as distâncias são medidas em "radianos". Se você tiver dados de localização armazenados em GeoJSON, o resultado será retornado em "metros".