Yah, tidak ada jawaban yang benar untuk pertanyaan ini, Tapi yang pasti, pendekatan yang Anda sebutkan bukanlah yang terbaik!
Pertama, ketika Anda berpikir untuk merancang model "obrolan", Anda perlu memperhitungkan bahwa akan ada jutaan pesan di antara pengguna, jadi Anda perlu memperhatikan kinerja saat ingin mengambil obrolan.
Menyimpan pesan ke dalam array sama sekali bukan ide yang baik, ukuran model Anda akan semakin besar seiring waktu dan Anda harus mempertimbangkan bahwa batas ukuran dokumen MongoDB saat ini adalah 16 MB per dokumen.
https://docs.mongodb.com/manual/reference/limits/
Kedua, Anda harus mempertimbangkan aspek pagination karena akan mempengaruhi kinerja ketika obrolan besar, ketika Anda mengambil obrolan antara 2 pengguna, Anda tidak akan meminta semua obrolan sejak awal, Anda hanya akan meminta yang terbaru, dan kemudian Anda dapat meminta yang lebih lama jika pengguna menggulir obrolan, aspek ini sangat penting dan tidak dapat diabaikan karena pengaruhnya terhadap kinerja.
Pendekatan saya adalah menyimpan setiap pesan dalam dokumen terpisah
Pertama-tama, menyimpan setiap pesan dalam satu dokumen akan meningkatkan kinerja Anda selama mengambil obrolan, dan ukuran dokumen akan sangat kecil.
Ini adalah contoh yang sangat sederhana, Anda perlu mengubah model sesuai dengan kebutuhan Anda, itu hanya untuk mewakili ide:
const MessageSchema = mongoose.Schema({
message:{
text: { type:String, required:true }
// you can add any other properties to the message here.
// for example, the message can be an image ! so you need to tweak this a little
}
// if you want to make a group chat, you can have more than 2 users in this array
users:[{
user: { type:mongoose.Schema.Types.ObjectId, ref:'User', required:true }
}]
sender: { type:mongoose.Schema.Types.ObjectId, ref:'User', required:true },
read: { type:Date }
},
{
timestamps: true
});
Anda dapat mengambil obrolan dengan kueri ini:
Message.find(({ users: { "$in" : [#user1#,#user2#]} })
.sort({ updatedAt: -1 })
.limit(20)
Mudah dan bersih! seperti yang Anda lihat, pagination menjadi sangat mudah dengan pendekatan ini.