2015-07-25 7 views
0

Это мой документ. Я хочу отсортировать документы массива по возрастанию, чтобы получить так, что мои запросы находятся в следующем коде. Но я не получаю документы в отсортированном виде.mongodb sorting array documents

Этот запрос

db.sample.find({_id: ObjectId("55b32f5957e47fabd30c5d2e")}).sort({'naresh.ts':1}).pretty(); 

Это результат я получаю

{ 
    "_id" : ObjectId("55b32f5957e47fabd30c5d2e"), 
    "naresh" : [ 
     { 
      "ts" : "hi", 
      "created_by" : 1437806425105 
     }, 
     { 
      "ts" : "hello", 
      "created_by" : 1437806425105 
     }, 
     { 
      "ts" : "waht", 
      "created_by" : 1437807757261 
     }, 
     { 
      "ts" : "lefo", 
      "created_by" : 1437807768514 
     }, 
     { 
      "ts" : "lefow", 
      "created_by" : 1437807775719 
     } 
    ] 
} 
+1

дубликата http://stackoverflow.com/questions/13449874/how-to-sort-array -inside-collection-record-in-mongodb – Adam

+0

Вам нужно использовать агрегацию, если вы хотите отсортировать массив внутри документа. – ZeMoon

+0

так что без агрегации я не могу сортировать документы. С агрегацией его работая, но в стеке переполняют некоторые из людей, которые решаются напрямую с помощью aggrregation, но не работают для меня –

ответ

0

Вы можете использовать $aggregation как следующий запрос:

db.collection.aggregate({ 
    "$match": { 
    "_id": ObjectId("55b32f5957e47fabd30c5d2e") 
    } 
}, { 
    $unwind: "$naresh" 
}, { 
    $sort: { 
    "naresh.ts": 1 
    } 
}, { 
    "$group": { 
    _id: "$_id", 
    "naresh": { 
     $push: "$naresh" 
    } 
    } 
}) 
0

Курсор .sort() только выглядит при значениях t он принимает решение использовать «наименьшее» значение указанного поля (в порядке возрастания), чтобы определить, как «сортировать» документы в ответе. Это не «сортирует» содержимое массива.

Чтобы отсортировать массив, необходимо использовать структуру агрегации для управления документом:

db.sample.aggregate([ 
    { "$match": { "_id": ObjectId("55b32f5957e47fabd30c5d2e") }, 
    { "$unwind": "$naresh" }, 
    { "$sort": { "$naresh.ts": 1 } }, 
    { "$group": { 
     "_id": "$_id", 
     "naresh": { "$push": "$naresh" } 
    }} 
]) 

Это сортирует массив.

еще лучше, если вы «всегда» хотите, то результаты отсортированные затем сделать это, как вы обновить документ:

db.sample.update({},{ "$push": { "$each": [], "$sort": { "ts": 1 } } },{ "multi": true }) 

И использовать те же, $each и $sort модификаторы при добавлении новых элементов в массиве а контент будет отсортирован.

0

Если вы хотите просто запросить коллекцию и получить сортировку, то Blackes Seven's answer будет отлично работать для вас.

Однако, если вы хотите обновить документы в отсортированном порядке, идут с этим обновление запроса:

update(
    { 
     _id: ObjectId("55b32f5957e47fabd30c5d2e") 
    }, 
    { 
     $push: { 
      naresh: { 
       $each: [], 
       $sort: {created_by: 1} 
      } 
     } 
    } 
)