MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách tổng hợp theo nhóm và sắp xếp chính xác

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 $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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để bạn truy cập một mục mảng cụ thể trong tập hợp phép chiếu MongoDB?

  2. Cách đóng con trỏ trong MongoKit

  3. Nhóm Mongodb và các nhà điều hành dự án

  4. MongoDB $ mul

  5. Cách lọc mảng trong tài liệu Mongodb bằng Spring