Hal pertama yang terlintas dalam pikiran di sini adalah:mengapa menyimpan referensi menghabiskan biaya 5.000 kali lipat dari biaya penyimpanan dalam subdokumen?
Oke, melihat skema Anda, saya yakin metode terbaik adalah kumpulan kata-kata yang terpisah, bukan paket.
Bendera merah pertama yang saya lihat adalah sarang ganda Anda di sini:
packages : [{
package : {type: Schema.Types.ObjectId, ref: 'Packages'},
from : {type : Schema.Types.ObjectId, ref :'Languages'},
to : {type : Schema.Types.ObjectId, ref :'Languages'},
words : [{
word: {type: String},
progress: {type: Number,default : 0}
}]
}]
words
subdocument akan sangat sulit untuk dikerjakan dalam versi MongoDB saat ini, biasanya 2-3 level mulai mengalami masalah, terutama dengan operator posisional.
Sekarang mengingat bahwa Anda harus selalu bekerja dari nilai setinggi mungkin yang bisa Anda dapatkan di sini:
Anda juga harus mempertimbangkan biaya perumahan dokumen ini. Operator yang Anda butuhkan akan berada di dalam memori seperti $pull
, $push
, $addToSet
dll yang berarti seluruh dokumen Anda perlu diserialisasi dan dimuat ke dalam struct C++ asli MongoDB. Ini akan menjadi tugas yang sangat memakan waktu tergantung pada lalu lintas ke dokumen tersebut.
Mempertimbangkan komentar Anda:
itu hanya menempatkan paku lain di peti mati menanamkan kata-kata dalam dokumen pengguna utama. Mempertimbangkan apa yang saya katakan di paragraf sebelumnya, ini tidak akan berfungsi dengan baik dengan biaya penggunaan operator dalam memori pada words
larik.
Ini akan bekerja lebih baik jika kata-katanya dipisahkan, $slice
juga merupakan operator dalam memori dan mungkin akan mengalami penurunan performa di sini.
Dan itu adalah tanggapan cepat yang beralasan. Saya yakin ada lebih banyak yang bisa saya jelaskan tentang alasan saya, tetapi itu sudah cukup.