2016-04-23 3 views
5

У меня есть три документа:Сортировка подмассивов в агрегате Результат

{ 
    "id_user": "t57092501745ad6285ac58c22", 
    "name": "Day #1", 
    "date": { 
     "$date": "2016-04-21T20:50:00.190Z" 
    }, 
    "text": "My text" 
} 

{ 
    "id_user": "t57092501745ad6285ac58c22", 
    "name": "Day #2", 
    "date": { 
     "$date": "2016-04-22T20:50:00.190Z" 
    }, 
    "text": "My text" 
} 

{ 
    "id_user": "t57092501745ad6285ac58c22", 
    "name": "Day #3", 
    "date": { 
     "$date": "2016-04-22T20:51:00.190Z" 
    }, 
    "text": "My text" 
} 

и мне нужно сгруппировать эти за день, так что я:

{ 
    "$match": { 
     "id_user": "t57092501745ad6285ac58c22" 
    } 
}, { 
    "$sort": { 
     "date": -1 
    } 
}, { 
    "$group": { 
     "_id": { 
      $dayOfYear: "$date" 
     }, 
     "data": { 
      "$push": { 
       "id_user": "$id_user", 
       "name": "$name", 
       "date": "$date", 
       "text": "$text" 
      }, 
     }, 
    } 

} 

и результат:

{ 
    { 
     _id: 113, 
     data: [{ 
      "id_user": "t57092501745ad6285ac58c22", 
      name: "Day #1", 
      date: "2016-04-22T20:51:00.190Z", 
      text: "My text" 
     }] 
    }, { 
     _id: 114, 
     data: [{ 
      "id_user": "t57092501745ad6285ac58c22", 
      name: "Day #3", 
      date: "2016-04-23T20:51:00.190Z", 
      text: "My text" 
     }, { 
      "id_user": "t57092501745ad6285ac58c22", 
      name: "Day #2", 
      date: "2016-04-23T20:50:00.190Z", 
      text: "My text" 
     }] 
    } 
} 

и это нормально, но порядок не то, что мне нужно:

{ Day #1 }, { Day #3, Day #2 } 

если изменить sort к { "date": 1 } я могу инвертировать порядок 2 группы, таким образом:

{ Day #3, Day #2 }, { Day #1 } 

, но я не знаю, как Тхо изменения также порядок внутри подрешетки, чтобы получите правильное значение:

{ Day #1 }, { Day #2, Day #3 } 

Каков правильный путь?

+0

Вы отсортирован в «нисходящей» порядке. Сортировка «по возрастанию» вместо: '{" $ sort ": {" date ": 1}}' –

+0

Нет, поскольку я говорю, что это не работает, прочитайте мой вопрос. –

+0

Да, пожалуйста, подумайте немного. Вы '$ sort' перед добавлением в массив, поэтому' $ push' будет уважать порядок обнаружения из '$ sort', а« элементы массива »будут отсортированы таким образом (с корректировкой порядка' $ sort' . '' Group' делает ** не **. Поэтому, если вы хотите, чтобы «документы» были исправны, вам нужно ** другое ** '$ sort' в качестве последнего этапа конвейера (также восходящего).' { «$ sort»: {«_id»: 1}} '. Посмотрите внимательно, день № 3 - это« более поздняя »дата, чем день № 2. Таким образом, у вас неправильный порядок, и не заметил, что' $ group' не исправьте в порядке. –

ответ

3

Если вы хотите, чтобы пункты в «массив», чтобы быть в «восходящей» порядка, то ваш $sort заказ неправильно, и вы должны полностью изменить его. Также вывод от $group в качестве «документа» никак не упорядочен. Так что если вы хотите конкретный заказ, то вам нужно на самом деле $sort на возвращаемом _id, а также:

[ 
    { "$match": { 
     "id_user": "t57092501745ad6285ac58c22" 
    }}, 
    { "$sort": { "date": 1 } } 
    { "$group": { 
     "_id": { "$dayOfYear": "$date" }, 
     "data": { 
      "$push": { 
       "id_user": "$id_user", 
       "name": "$name", 
       "date": "$date", 
       "text": "$text" 
      } 
     } 
    }}, 
    { "$sort": { "_id": 1 } } 
] 

Затем обе заказы затем правильно

+0

Это правильный ответ. –

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