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

Mongo:cách sắp xếp theo trọng lượng bên ngoài

Cho mảng [4,7,90,1] những gì bạn muốn trong truy vấn của mình là:

db.collection.aggregate([
   { "$project": {
       "user_id": 1,
       "content": 1,
       "date": 1,
       "weight": { "$or": [
           { "$eq": ["$user_id": 4] }, 
           { "$eq": ["$user_id": 7] }, 
           { "$eq": ["$user_id": 90] }, 
           { "$eq": ["$user_id": 1] }, 
       ]}
   }},
   { "$sort": { "weight": -1, "date": -1 } }
])

Vì vậy, đó là những gì, cho mọi mục có trong $or đó điều kiện, user_id trường được kiểm tra dựa trên giá trị được cung cấp và $eq trả về 1 hoặc 0 cho true hoặc false .

Những gì bạn làm trong mã của mình là cho từng mục bạn có trong mảng mà bạn xây dựng điều kiện mảng của $or . Vì vậy, nó chỉ tạo một cấu trúc băm cho mỗi điều kiện bằng, chuyển nó vào một mảng và cắm nó vào làm giá trị mảng cho $or điều kiện.

Tôi có lẽ nên để toán tử $ cond ra khỏi mã trước đó để phần này sẽ rõ ràng hơn.

Đây là một số mã cho Ruby Brain:

userList = [4, 7, 90, 1];

orCond = [];

userList.each do |userId|
  orCond.push({ '$eq' => [ 'user_id', userId ] })
end

pipeline = [
    { '$project' => {
        'user_id' => 1,
        'content' => 1,
        'date' => 1,
        'weight' => { '$or' => orCond }
    }},
    { '$sort' => { 'weight' => -1, 'date' => -1 } }
]

Nếu bạn muốn có các trọng số riêng lẻ và chúng tôi sẽ giả định các cặp giá trị khóa, thì bạn cần phải lồng với $ cond:

db.collection.aggregate([
   { "$project": {
       "user_id": 1,
       "content": 1,
       "date": 1,
       "weight": { "$cond": [
           { "$eq": ["$user_id": 4] },
           10,
           { "$cond": [ 
               { "$eq": ["$user_id": 7] },
               9,
               { "$cond": [
                   { "$eq": ["$user_id": 90] },
                   7,
                   { "$cond": [
                       { "$eq": ["$user_id": 1] },
                       8, 
                       0
                   ]}
               ]}
           ]}
       ]}
   }},
   { "$sort": { "weight": -1, "date": -1 } }
])

Lưu ý rằng đó chỉ là một giá trị trả về, những giá trị này không cần phải theo thứ tự. Và bạn có thể nghĩ về thế hệ của điều đó.

Để tạo cấu trúc này, hãy xem tại đây:

https://stackoverflow.com/a/22213246/2313887




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Percona Live 2017 - Bản tóm tắt của Somenines

  2. Khi nào sử dụng GridFS trên MongoDB?

  3. Sao chép / sao chép bộ sưu tập trong MongoDB

  4. MongoDB ::ID Mongo có phải là duy nhất trên các bộ sưu tập không?

  5. Kiểu nhúng Golang + MongoDB (nhúng một cấu trúc vào một cấu trúc khác)