2016-04-23 124 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}}'仔細看,第三天比第二天晚,因此你的訂單錯了,沒有注意到'$ group'沒有排列順序排列 –

回答

3

如果您希望「數組」中的項目按「升序」順序排列,那麼您的$sort順序是錯誤的,您需要將其取消。從$group作爲「文檔」的輸出也不以任何方式排序。所以,如果你想要一個特定的順序,那麼你需要在返回_id以及實際$sort

[ 
    { "$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

這是正確的答案。 –