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

Mongo Urutkan berdasarkan Hitungan Kecocokan dalam Array

Untuk benar-benar menjawab ini terlebih dahulu, Anda perlu "menghitung" jumlah kecocokan dengan kondisi yang diberikan untuk "mengurutkan" hasil agar kembali dengan preferensi ke kecocokan terbanyak di atas.

Untuk ini, Anda memerlukan kerangka kerja agregasi, yang Anda gunakan untuk "perhitungan" dan "manipulasi" data di MongoDB:

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

Pada MongoDB yang lebih lama dari versi 3, Anda dapat melakukan bentuk yang lebih panjang:

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

Dalam kedua kasus, fungsi di sini adalah untuk mencocokkan dokumen yang mungkin dengan kondisi terlebih dahulu dengan memberikan "daftar" argumen dengan $in . Setelah hasil diperoleh, Anda ingin "menghitung" jumlah elemen yang cocok dalam larik ke "daftar" nilai yang mungkin disediakan.

Dalam bentuk modern $setIntersection operator membandingkan dua "daftar" yang mengembalikan larik baru yang hanya berisi anggota yang cocok "unik". Karena kita ingin tahu berapa banyak kecocokan itu, kita cukup mengembalikan $size dari daftar itu.

Di versi yang lebih lama, Anda memisahkan larik dokumen dengan $unwind untuk melakukan operasi di atasnya karena versi yang lebih lama tidak memiliki operator baru yang bekerja dengan array tanpa perubahan. Proses kemudian melihat setiap nilai secara individual dan jika salah satu ekspresi di $or cocok dengan nilai yang mungkin maka $cond ternary mengembalikan nilai 1 ke $sum akumulator, jika tidak 0 . Hasil bersihnya adalah "jumlah kecocokan" yang sama seperti yang ditunjukkan untuk versi modern.

Hal terakhir adalah $sort hasil berdasarkan "jumlah kecocokan" yang dikembalikan sehingga yang paling cocok ada di "atas". Ini adalah "urutan menurun" dan oleh karena itu Anda memberikan -1 untuk menunjukkan hal itu.

Addendum tentang $in dan array

Anda salah memahami beberapa hal tentang kueri MongoDB sebagai permulaan. $in operator sebenarnya ditujukan untuk "daftar" argumen seperti ini:

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

Yang pada dasarnya adalah cara singkat untuk mengatakan "Cocokkan 'wortel' atau 'pisang' di properti 'Kunci'" . Dan bahkan bisa ditulis dalam bentuk panjang seperti ini:

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

Yang benar-benar akan mengarahkan Anda jika itu adalah kondisi kecocokan "tunggal", maka Anda cukup memberikan nilai untuk dicocokkan dengan properti:

{ "Keys": "carrot" }

Jadi itu harus menutupi kesalahpahaman bahwa Anda menggunakan $in untuk mencocokkan properti yang merupakan array dalam dokumen. Sebaliknya, kasus "terbalik" adalah penggunaan yang dimaksudkan di mana Anda menyediakan "daftar argumen" untuk mencocokkan properti yang diberikan, baik properti itu array atau hanya satu nilai.

Mesin kueri MongoDB tidak membedakan antara nilai tunggal atau larik nilai dalam operasi yang sama atau serupa.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Grup dan sortir Mongodb

  2. Mongoid atau MongoMapper?

  3. mongodb menambahkan penghitung ke setiap dokumen yang diambil

  4. Pertanyaan Wawancara MongoDB Umum

  5. Cara Menghapus Bidang dari Dokumen MongoDB ($ tidak disetel)