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

Mongo Sắp xếp theo Số lượng Kết quả phù hợp trong Mảng

Để thực sự trả lời câu hỏi này, trước tiên bạn cần "tính toán" số lượng kết quả phù hợp với điều kiện đã cho để "sắp xếp" kết quả để trả về với ưu tiên những kết quả phù hợp nhất ở trên cùng.

Đối với điều này, bạn cần khung tổng hợp, là khung mà bạn sử dụng để "tính toán" và "thao tác" dữ liệu trong MongoDB:

db.multiArr.aggregate([
  { "$match": { "Keys": { "$in": [ "carrot", "banana" ] } } },
  { "$project": {
    "ID": 1,
    "Keys": 1,
    "order": {
      "$size": {
        "$setIntersection": [ ["carrot", "banana"], "$Keys" ]
      }
    }
  }},
  { "$sort": { "order": -1 } }
])

Trên MongoDB cũ hơn phiên bản 3, thì bạn có thể thực hiện ở dạng dài hơn:

db.multiArr.aggregate([
  { "$match": { "Keys": { "$in": [ "carrot", "banana" ] } } },
  { "$unwind": "$Keys" },
  { "$group": {
    "_id": "$_id",
    "ID": { "$first": "$ID" },
    "Keys": { "$push": "$Keys" },
    "order": {
      "$sum": {
        { "$cond": [
          { "$or": [
           { "$eq": [ "$Keys", "carrot" ] },
           { "$eq": [ "$Keys", "banana" ] }
         ]},
         1,
         0
        ]}
      }
    }
  }},
  { "$sort": { "order": -1 } }
])

Trong cả hai trường hợp, chức năng ở đây trước tiên là khớp các tài liệu có thể có với các điều kiện bằng cách cung cấp "danh sách" các đối số với $in . Sau khi thu được kết quả, bạn muốn "đếm" số phần tử phù hợp trong mảng vào "danh sách" các giá trị có thể được cung cấp.

Ở dạng hiện đại, $setIntersection toán tử so sánh hai "danh sách" trả về một mảng mới chỉ chứa các thành viên phù hợp "duy nhất". Vì chúng tôi muốn biết có bao nhiêu kết quả phù hợp, chúng tôi chỉ cần trả về $size trong danh sách đó.

Trong các phiên bản cũ hơn, bạn tách mảng tài liệu bằng $unwind để thực hiện các hoạt động trên nó vì các phiên bản cũ hơn thiếu các toán tử mới hơn làm việc với các mảng mà không bị thay đổi. Sau đó, quá trình xem xét từng giá trị riêng lẻ và nếu là biểu thức trong $or khớp với các giá trị có thể có sau đó là $cond ternary trả về giá trị 1 vào $sum bộ tích lũy, nếu không thì 0 . Kết quả thực là "số lượng trận đấu" giống như được hiển thị cho phiên bản hiện đại.

Điều cuối cùng chỉ đơn giản là $sort kết quả dựa trên "số trận đấu" đã được trả về để các trận đấu nhiều nhất nằm trên "đầu trang". Đây là "thứ tự giảm dần" và do đó bạn cung cấp -1 để chỉ ra rằng.

Phụ lục liên quan đến $ in và mảng

Bạn đang hiểu sai một số điều về các truy vấn MongoDB cho người mới bắt đầu. $in toán tử thực sự được dành cho một "danh sách" các đối số như sau:

{ "Keys": { "$in": [ "carrot", "banana" ] } }

Về cơ bản, đây là cách nói viết tắt của "Đối sánh với 'cà rốt' hoặc 'banana' trong thuộc tính 'Keys' " . Và thậm chí có thể được viết ở dạng dài như thế này:

{ "$or": [{ "Keys": "carrot" }, { "Keys": "banana" }] }

Điều thực sự sẽ dẫn bạn đến nếu đó là điều kiện khớp "số ít", thì bạn chỉ cần cung cấp giá trị để khớp với thuộc tính:

{ "Keys": "carrot" }

Vì vậy, điều đó sẽ che đậy quan niệm sai lầm rằng bạn sử dụng $in để khớp một thuộc tính là một mảng trong tài liệu. Thay vào đó, trường hợp "ngược lại" là mục đích sử dụng mà thay vào đó, bạn cung cấp "danh sách các đối số" để khớp với một thuộc tính nhất định, thuộc tính đó là một mảng hoặc chỉ một giá trị duy nhất.

Công cụ truy vấn MongoDB không phân biệt một giá trị đơn lẻ hay một mảng giá trị trong một phép toán bình đẳng hoặc tương tự.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:Tính toán thời gian dừng giữa mỗi lần thay đổi giá trị trạng thái

  2. Mẹo để chạy MongoDB trong sản xuất bằng cách sử dụng các luồng thay đổi

  3. Nhập dữ liệu vào các phiên bản MongoDB mới được tạo của bạn

  4. MongoNetworkError:không kết nối được với máy chủ [localhost:27017] trong lần kết nối đầu tiên [MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]

  5. MongoDB $ cosh