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.