2016-04-23 18 views
5

Tôi có ba tài liệu:Sắp xếp phụ mảng trong một quả tổng hợp

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

và tôi cần phải nhóm những cho ngày, vì vậy tôi làm:

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

} 

và kết quả là:

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

và không sao, nhưng đơn đặt hàng không phải là thứ tôi cần:

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

nếu tôi thay đổi sort để { "date": 1 } tôi có thể đảo ngược thứ tự của 2 nhóm, theo cách này:

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

nhưng tôi không biết làm thế nào tho thay đổi cũng trật tự bên trong tiểu mảng, để có được chính xác:

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

Cách chính xác là gì?

+0

Bạn được sắp xếp trong "giảm dần" theo thứ tự. Sắp xếp "tăng dần" thay vì: '{" $ sort ": {" date ": 1}}' –

+0

Không, như tôi nói điều này không có tác dụng, vui lòng đọc câu hỏi của tôi. –

+0

Có, hãy suy nghĩ một chút. Bạn '$ sort' trước khi bạn thêm vào mảng, vì vậy' $ push' sẽ tôn trọng thứ tự khám phá từ '$ sort' và" phần tử mảng "sẽ được sắp xếp theo cách đó (với thứ tự' $ sort' được sửa '$ Group' không ** không ** Vì vậy nếu bạn muốn" tài liệu "được phát ra theo thứ tự thì bạn cần ** một' 'sort'' khác làm giai đoạn cuối cùng (cũng tăng dần). {{ "$ sort": {"_id": 1}} 'Nhìn kỹ, ngày # 3 là ngày" muộn hơn "ngày thứ 2. Vì vậy, bạn có thứ tự sai, và không lưu ý rằng' $ group' không –

Trả lời

3

Nếu bạn muốn các mục trong "mảng" nằm trong thứ tự "tăng dần", thì đơn đặt hàng $sort của bạn sai và bạn cần phải đảo ngược. Ngoài ra đầu ra từ $group dưới dạng "tài liệu" không được đặt hàng theo bất kỳ cách nào. Vì vậy, nếu bạn muốn có một thứ tự cụ thể thì bạn cần phải thực sự $sort trên trở _id cũng như:

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

Sau đó, cả hai đơn đặt hàng này sau đó được xác

+0

Đây là câu trả lời đúng. –

Các vấn đề liên quan