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

Cara mengurutkan dokumen berdasarkan panjang bidang Array

Apa yang tampaknya Anda maksudkan di sini adalah bahwa Anda ingin "mengurutkan" hasil Anda berdasarkan "panjang" dari larik "jawaban", daripada "properti" yang disebut "panjang" seperti yang tersirat dalam sintaks Anda. Sebagai catatan, sintaks itu tidak mungkin di sini karena model Anda "direferensikan", artinya satu-satunya data yang ada dalam bidang array dalam dokumen koleksi ini adalah ObjectId nilai dari dokumen yang direferensikan.

Tetapi Anda dapat melakukannya menggunakan .aggregate() metode dan $size operator:

Question.aggregate(
    [
        { "$project": {
            "title": 1,
            "content": 1,
            "created": 1,
            "updated": 1,
            "author": 1,
            "answers": 1,
            "length": { "$size": "$answers" }
        }},
        { "$sort": { "length": -1 } },
        { "$limit": 5 }
    ],
    function(err,results) {
        // results in here
    }
)

Pipa agregasi bekerja secara bertahap. Pertama, ada $project untuk bidang dalam hasil, di mana Anda menggunakan $size untuk mengembalikan panjang larik yang ditentukan.

Sekarang ada kolom dengan "panjang", Anda mengikuti tahapan dengan $sort dan $limit yang diterapkan sebagai tahapannya sendiri dalam alur agregasi.

Pendekatan yang lebih baik adalah selalu mempertahankan properti panjang dari larik "jawaban" Anda di dalam dokumen. Ini memudahkan pengurutan dan kueri tanpa operasi lain. Mempertahankan ini sederhana menggunakan $inc operator sebagai Anda $push atau $pull item dari larik:

Question.findByIdAndUpdate(id,
    {
        "$push": { "answers": answerId },
        "$inc": { "answerLength": 1 } 
    },
    function(err,doc) {

    }
)

Atau sebaliknya saat melepas:

Question.findByIdAndUpdate(id,
    {
        "$pull": { "answers": answerId },
        "$inc": { "answerLength": -1 } 
    },
    function(err,doc) {

    }
)

Bahkan jika Anda tidak menggunakan operator atom, maka prinsip yang sama berlaku di mana Anda memperbarui "panjang" saat Anda melanjutkan. Maka kueri dengan pengurutan menjadi sederhana:

Question.find().sort({ "answerLength": -1 }).limit(5).exec(function(err,result) {

});

Karena properti sudah ada di dokumen.

Jadi lakukan dengan .aggregate() tanpa perubahan pada data Anda, atau ubah data Anda untuk selalu menyertakan panjang sebagai properti dan kueri Anda akan sangat cepat.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongodb menyaring dokumen dengan garis bujur, garis lintang dan dengan jarak tertentu

  2. MongoDB:hapus batasan unik

  3. Fungsi MapReduce di MongoDB - Mengelompokkan dokumen berdasarkan ID

  4. Lembar Cheat Kinerja untuk MongoDB

  5. pencocokan array mongodb