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

Cara menemukan dokumen dengan entri array yang persis sama seperti dalam kueri

Ada beberapa "kasus yang sangat berguna" di sini di mana sebenarnya mencoba membuat "hash unik" di atas konten array sebenarnya "menghalangi" berbagai masalah yang dapat diatasi dengan mudah.

Menemukan Kesamaan dengan "Saya"

Jika Anda misalnya mengambil "pengguna 1" dari sampel yang disediakan, dan menganggap bahwa Anda sudah memuat data itu dan ingin menemukan "mereka yang sama dengan saya" dengan "itemsIds" yang cocok dari apa yang dimiliki objek pengguna saat ini, maka di sana adalah dua pendekatan kueri sederhana:

  1. Temukan "persis" yang sama: Di sinilah Anda ingin memeriksa data pengguna lain untuk melihat pengguna yang memiliki minat "tepat" yang sama. Ini adalah penggunaan sederhana dan "tidak berurutan" dari $all operator kueri:

    db.collection.find({ 
        "itemsIds": { "$all": [399957190, 366369952] },
        "userId": { "$ne": 1 }
    })
    

    Yang akan mengembalikan "pengguna 3" karena merekalah yang memiliki entri "itemsIds" umum "keduanya". Urutan tidak penting di sini karena selalu cocok dalam urutan apa pun, selama keduanya ada di sana. Ini adalah bentuk lain dari $and sebagai argumen kueri.

  2. Temukan kesamaan "mirip" dengan saya": Yang pada dasarnya menanyakan "apakah Anda memiliki sesuatu yang sama?" . Untuk itu Anda dapat menggunakan $in operator kueri. Ini akan cocok jika "salah satu" dari kondisi yang ditentukan terpenuhi:

    db.collection.find({ 
        "itemsIds": { "$in": [399957190, 366369952] },
        "userId": { "$ne": 1 }
    })
    

    Dalam hal ini "baik" "pengguna 2" dan "pengguna 3" akan cocok, karena mereka "setidaknya" berbagi "satu" dari kondisi yang ditentukan dan itu berarti memiliki "sesuatu yang sama" dengan sumber data kueri.

    Ini sebenarnya adalah bentuk lain dari $or operator kueri, dan sama seperti sebelumnya, menulis cara ini jauh lebih sederhana dan ringkas mengingat kondisi yang harus diterapkan.

Menemukan "Sesuatu" yang Umum

Ada juga kasus di mana Anda mungkin ingin menemukan hal-hal "kesamaan" tanpa memiliki "pengguna" dasar untuk memulai. Jadi, bagaimana Anda mengetahui bahwa "pengguna 1" dan "pengguna 2" berbagi "itemIds" yang sama, atau faktanya bahwa berbagai pengguna mungkin berbagi nilai "itemIds" yang sama secara individual, tetapi siapa mereka?

  1. Dapatkan kecocokan persis: Tentu saja di mana Anda melihat nilai "itemsIds" dan $group mereka bersama-sama. Umumnya "pesanan itu penting" di sini, jadi secara optimal Anda memilikinya "dipesan di muka" dan secara konsisten selalu membuatnya sesederhana:

    db.collection.aggregate([
        { "$group": {
            "_id": "$itemsIds",
            "common": { "$push": "$userId" }
        }}
    ])
    

    Dan hanya itu yang ada di sana, selama pesanan sudah ada di sana. Jika tidak, maka Anda dapat melakukan formulir bertele-tele yang sedikit lebih panjang untuk melakukan "pemesanan", tetapi hal yang sama dapat dikatakan untuk menghasilkan "hash":

    db.collection.aggregate([
        { "$unwind": "$itemsIds" },
        { "$sort": { "_id": 1, "itemsIds": 1 } },
        { "$group": {
            "_id": "$_id",
            "userId": { "$first": "$userId" },
            "itemsIds": { "$push": "$itemsIds" }
        }},
        { "$group": {
            "_id": "$itemsIds",
            "common": { "$push": "$userId" }
        }}
    ])
    

    Bukan pemain "super", tetapi itu menunjukkan mengapa Anda selalu memesan penambahan entri array. Yang merupakan proses yang sangat sederhana.

  2. Umum "pengguna" untuk "item": Yang merupakan proses sederhana lain yang mengabstraksi di atas dengan "menghancurkan" array di bawah $unwind , dan pada dasarnya mengelompokkan kembali:

    db.collection.aggregate([
        { "$unwind": "$itemsIds" },
        { "$group": {
            "_id": "$itemsIds",
            "users": { "$addToSet": "$userId" }
        }}
    ])
    

    Dan lagi, hanya agregator pengelompokan sederhana dari $addToSet melakukan pekerjaan dan mengumpulkan nilai "distinct userId" untuk setiap nilai "itemsIds".

Ini semua adalah solusi dasar, dan saya bisa melanjutkan dengan "mengatur persimpangan" dan apa yang tidak, tetapi ini adalah "primer".

Jangan mencoba menghitung "hash", MongoDB memiliki "arsenal" yang bagus untuk mencocokkan entri. Gunakan dan "salahgunakan" juga, sampai rusak. Kemudian berusaha lebih keras.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Filter array bersarang dengan kondisi berdasarkan nilai objek multi-level dan perbarui - agregat MongoDB + pembaruan

  2. Mongodb $lookup di data musim semi mongo

  3. Bagaimana cara menanyakan dokumen menggunakan bidang _id di driver Java mongodb?

  4. Regex dengan OR di Java - mongoDB

  5. mencari database dengan api luwak dan nodejs?