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

Làm cách nào để sắp xếp một bộ sưu tập dựa trên các giá trị trong một mảng

Như bạn có thể đã thử, bạn không thể chỉ định một mục cụ thể bên trong một mảng làm "khóa" để "sắp xếp" với một tìm kiếm đơn giản. Đối với điều này, bạn sẽ cần phương pháp tổng hợp để có được các khóa bạn muốn sắp xếp.

db.exam.aggregate([

     # Unwind to de-normalize
     { "$unwind": "$result" },

     # Group back to the document and extract each score
     { "$group": {
         "_id": "$_id",
         "result": { "$push": "$result" },
         "useruid": { "$first": "$useruid" },
         "exam_code": { "$first": "$exam_code" },
         "ess_time": { "$first": "$ess_time" },
         "Total": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Total" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Physics": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Physics" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Mathematics": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Mathematics" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Chemistry": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Chemistry" ] },
                     "$result.score",
                     0
                 ]
             }
         },
         "Biology": { 
             "$max": {
                 "$cond": [
                     { "$eq": [ "$result.subject", "Biology" ] },
                     "$result.score",
                     0
                 ]
             }
         }
     }},

     # Sort on those scores
     { "$sort": {
         "Total": -1,
         "Physics": -1,
         "Mathematics": -1,
         "Chemistry": -1,
         "Biology": -1
     }},

     # Project final wanted fields
     { "$project": {
         "result": 1,
         "useruid": 1,
         "exam_code": 1,
         "ess_time": 1
     }}
])

Vì vậy, ở đây bạn "trích xuất" các giá trị phù hợp bằng cách sử dụng mã <> $ cond toán tử trong $ max câu lệnh sau khi giải nén mảng. Các tài liệu không chuẩn hóa không phải tất cả đều có cùng giá trị như bây giờ chúng đại diện cho các mục trong mảng, vì vậy bạn hãy kiểm tra chúng.

Với các khóa được trích xuất đó, bạn có thể sắp xếp lại toàn bộ tài liệu của mình và cuối cùng loại bỏ các trường đó khi bạn không cần nữa.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Công cụ giám sát và khám phá máy chủ không được dùng nữa

  2. mongoDB:$ inc của một tài liệu không tồn tại trong một mảng

  3. Mongodb tổng hợp:chuyển đổi ngày sang múi giờ khác

  4. Lọc các phần tử mảng với $ regex

  5. Moongoose tổng hợp $ trận đấu không khớp với id's