Có một số điều cần hiểu ở đây.
Khi bạn sử dụng $group
các ranh giới sẽ được sắp xếp theo thứ tự mà chúng được phát hiện mà không có giai đoạn đầu hoặc giai đoạn kết thúc $sort
hoạt động. Vì vậy, nếu tài liệu của bạn ban đầu theo thứ tự như thế này:
{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
Sau đó, chỉ cần sử dụng $group
không có $sort
ở cuối đường dẫn sẽ trả về cho bạn kết quả như thế này:
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
Đó là một khái niệm, nhưng thực sự có vẻ như những gì bạn đang mong đợi trong kết quả yêu cầu trả về "các trường khác cuối cùng" theo thứ tự được sắp xếp của uid
là những gì bạn đang tìm kiếm. Trong trường hợp đó, cách để bạn nhận được kết quả thực sự là $sort
trước tiên và sau đó sử dụng $last
nhà điều hành:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"created": { "$last": "$created" },
"another_col": { "$last": "$created" }
}}
])
Hoặc về cơ bản áp dụng cách sắp xếp cho những gì bạn muốn.
Sự khác biệt giữa $last
và $max
là cái sau sẽ chọn giá trị "cao nhất" cho trường đã cho trong nhóm _id
, bất kể thứ tự hiện tại được sắp xếp theo thứ tự chưa được sắp xếp. Mặt khác, $last
sẽ chọn giá trị xuất hiện trong cùng một "hàng" với "cuối cùng" nhóm _id
giá trị.
Nếu bạn thực sự đang tìm cách sắp xếp các giá trị của một mảng thì cách tiếp cận cũng tương tự. Giữ các thành viên mảng theo thứ tự "đã tạo", bạn cũng sẽ sắp xếp trước:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"row": {
"$push": {
"created": "$created",
"another_col": "$another_col"
}
}
}}
])
Và các tài liệu có các trường đó sẽ được thêm vào mảng với thứ tự chúng đã được sắp xếp.