MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mongo:cara mengurutkan berdasarkan berat eksternal

Diberikan array [4,7,90,1] yang Anda inginkan dalam kueri Anda adalah ini:

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 } }
])

Jadi yang dilakukan adalah, untuk setiap item yang terkandung dalam $or kondisi, user_id bidang diuji terhadap nilai yang diberikan, dan $eq mengembalikan 1 atau 0 untuk true atau false .

Apa yang Anda lakukan dalam kode Anda adalah untuk setiap item yang Anda miliki dalam larik yang Anda bangun kondisi larik $or . Jadi itu hanya membuat struktur hash untuk setiap kondisi yang sama, meneruskannya ke array dan memasukkannya sebagai nilai array untuk $or kondisi.

Saya mungkin harus meninggalkan operator $cond dari kode sebelumnya sehingga bagian ini akan lebih jelas.

Berikut beberapa kode untuk 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 } }
]

Jika Anda ingin memiliki bobot individual dan kami akan menganggap pasangan nilai kunci, maka Anda perlu bersarang dengan $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 } }
])

Perhatikan bahwa ini hanya nilai balik, ini tidak perlu berurutan. Dan Anda dapat memikirkan tentang generasi itu.

Untuk menghasilkan struktur ini lihat di sini:

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Tip Manajemen Pencadangan MongoDB untuk Cluster Sharded

  2. Memformat Angka sebagai Persentase dalam SQL

  3. Impor data csv sebagai array di mongodb menggunakan mongoimport

  4. Apa cara yang benar untuk Mengindeks di MongoDB ketika ada kombinasi besar bidang?

  5. MongoDB -- Menyetel pernyataan bersyarat di .find()