2016-04-23 18 views
5

に、私は3つの文書がありますソートサブアレイ集計結果

{ 
    "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 } 

私は2グループの順序を逆にすることができますsort{ "date": 1 }に、このよう変更した場合:

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

を私は知らないどのようにも変更サブアレイ内の順にカントー正しいものを入手してください:

正しい方法はありますか?

+0

正しいです。 '{" $ sort ":{" date ":1}}' –

+0

いいえ、これはうまくいかないと言いますが、私の質問をお読みください。 –

+0

はい、少し考えてください。 '$ sort'は配列に追加する前に' $ sort'を実行するので、 '$ push'は' $ sort'の発見順序を尊重し、配列要素はそのようにソートされます'$ group'は** not **ですので、' 'ドキュメント ''を順番に並べ替えるには、最後のパイプラインステージ(昇順)として別の**' $ sort'が必要です。 '{ "$ sort":{"_id":1}} '慎重に見て、Day#3はDay#2よりも"遅い "日付ですので、順序が間違っています。 –

答えて

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

これは正解です。 –

関連する問題