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

MongoDB menemukan subdokumen dan mengurutkan hasilnya

Seperti yang disebutkan, saya berharap dokumen Anda benar-benar memiliki array, tetapi jika $elemMatch bekerja untuk Anda, maka seharusnya demikian.

Bagaimanapun, Anda tidak dapat mengurutkan berdasarkan elemen dalam array menggunakan find. Tetapi ada kasus di mana Anda dapat melakukan ini menggunakan .aggregate() :

db.collection.aggregate([

    // Match the documents that you want, containing the array
    { "$match": {
        "nlp.entities": {
            "$elemMatch": { 
                "text": "Neelie Kroes", 
                "type": "Person"   
            }
        }
    }},

    // Project to "store" the whole document for later, duplicating the array
    { "$project": {
        "_id": {
            "_id": "$_id",
            "url": "$url",
            "nlp": "$nlp"          
        },
        "entities": "$nlp.entities"
    }},

    // Unwind the array to de-normalize
    { "$unwind": "$entities" },

    // Match "only" the relevant entities
    { "$match": {
        "entities.text": "Neelie Kroes", 
        "entities.type": "Person"   
    }},

    // Sort on the relevance
    { "$sort": { "entities.relevance": -1 } },

    // Restore the original document form
    { "$project": {
        "_id": "$_id._id",
        "url": "$_id.url",
        "nlp": "$_id.nlp"
    }}
])

Jadi intinya, setelah melakukan $match kondisi untuk dokumen yang berisi kecocokan yang relevan, Anda kemudian menggunakan $project "simpan" dokumen asli di _id bidang dan $unwind "salinan" dari larik "entitas".

$match berikutnya "menyaring" konten larik hanya yang relevan. Kemudian Anda menerapkan $sort ke dokumen "cocok".

Karena dokumen "asli" disimpan di bawah _id , Anda menggunakan $project untuk "memulihkan" struktur dokumen yang sebenarnya harus dimulai.

Begitulah cara Anda "mengurutkan" elemen larik yang cocok.

Perhatikan bahwa jika Anda memiliki beberapa "kecocokan" dalam larik untuk dokumen induk, maka Anda harus menggunakan $group tahap untuk mendapatkan nilai $max untuk bidang "relevansi" untuk menyelesaikan pengurutan Anda.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Perbedaan antara menyimpan ObjectId dan bentuk stringnya, di MongoDB

  2. Tambahkan semacam nomor baris ke perintah/pipa agregat mongodb

  3. MongoDB &Meteor - Permintaan untuk mendorong ke array bersarang tidak berfungsi, tidak ada kesalahan yang dilemparkan

  4. Perbarui objek array bersarang berdasarkan properti di MongoDB

  5. Buat, Baca, Perbarui, Hapus data dengan menggunakan Node.js - Mongoose