2015-07-17 2 views
1

У меня есть следующие данные:Geonear сортировать по расстоянию и времени

{ 
    "_id" : ObjectId("55a8c1ba3996c909184d7a22"), 
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639", 
    "createdate" : ISODate("2015-07-17T08:50:02.892Z"), 
    "palce" : "aa", 
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.607312, 29.575281 ] 
} 
{ 
    "_id" : ObjectId("55a8c1ba3996c909184d7a24"), 
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639", 
    "createdate" : ISODate("2015-07-17T08:50:02.920Z"), 
    "palce" : "bbb", 
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.589896, 29.545098 ] 
} 
{ 
    "_id" : ObjectId("55a8c1ba3996c909184d7a25"), 
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639", 
    "createdate" : ISODate("2015-07-17T08:50:02.922Z"), 
    "palce" : "ccc", 
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.590758, 29.566713 ] 
} 
{ 
    "_id" : ObjectId("55a8c1ba3996c909184d7a26"), 
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639", 
    "createdate" : ISODate("2015-07-17T08:50:02.923Z"), 
    "palce" : "ddd", 
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.637039, 29.561436 ] 
} 
{ 
    "_id" : ObjectId("55a8c1bc3996c909184d7a27"), 
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639", 
    "createdate" : ISODate("2015-07-17T08:50:04.499Z"), 
    "palce" : "eee", 
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.539522, 29.57929 ] 
} 
{ 
    "_id" : ObjectId("55a8d12e78292fa3837ebae4"), 
    "uid" : "1db82e8a-2038-4818-b805-76a46ba62639", 
    "createdate" : ISODate("2015-07-17T09:55:58.947Z"), 
    "palce" : "fff", 
    "sex" : 1, 
    "longdis" : 1, 
    "location" : [ 106.637039, 29.561436 ] 
} 

я хочу в первую очередь, сортировать по расстоянию, если расстояние такое же, сортировать по времени.

моя команда:

db.runCommand({ 
    geoNear: "paging", 
    near: [106.606033,29.575897 ], 
    spherical : true, 
    maxDistance : 1/6371, 
    minDistance:0/6371, 
    distanceMultiplier: 6371, 
    num:2, 
    query: {'_id': {'$nin': []}} 
}) 

или

db.paging.find({ 
    'location':{ 
     $nearSphere: [106.606033,29.575897], 
     $maxDistance:1 
    } 
}).limit(5).skip((2 - 1) * 2).sort({createdate:-1}) 

Как я могу сортировать на обоих "ближайший" и "createddate"?

ответ

4

Правильный запрос использовать здесь использует aggregation framework, который имеет стадию $geoNear трубопровода, чтобы помочь с этим. Это также единственное место, где вы можете «сортировать» по нескольким клавишам, так как, к сожалению, «геопространственный» $nearSphere не имеет «мета» проекции для «расстояния», например, $text имеет «оценку».

Также используемая вами команда базы данных geoNear также не может использоваться с «курсором» .sort().

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

Это эквивалент того, что вы пытаетесь сделать.

С рамками агрегации вы используете "pipeline operators" вместо «курсора модификаторов», чтобы сделать такие вещи, как $sort, $skip и $limit. Также эти должны быть в в логическом порядке, тогда как модификаторы курсора обычно работают.

Это «трубопровод», как «труба Unix». |

Кроме того, будьте осторожны с «maxDistance» и «distanceMuliplier». Поскольку ваши координаты находятся в «унаследованных координированных парах», а не в формате GeoJSON, то расстояния измеряются в «радианах». Если у вас есть данные о местоположении GeoJSON, результат возвращается в «метрах».

+0

пользователь команда последующую не работает: db.paging.aggregate ([ { "$ geoNear": { "ряд": [106.606033,29.575897], "сферический": правда, "distanceField": "Расстояние" , "distanceMuliplier": 6371, "maxDistance": 1/6371 }}, {"$ sort": {"distance": 1, "createdate": -1}, {"$ skip": (2-1) * 2}, {"$ limit": 5} ]), если удалить "{" $ sort ": {" distance ": 1," createdate ": -1}," его работы в порядке. – user2968187

+0

@ user2968187 Набрав ошибку у меня. Пропустил закрытие '' 'на этапе' $ sort'. Исправлено. –

+0

Да, это нормально, @Blakes Семь спасибо вам большое. – user2968187

Смежные вопросы