No, na tuto otázku neexistuje správná odpověď, ale rozhodně, přístupy, které jste zmínil, nejsou vůbec nejlepší!
Za prvé, když přemýšlíte o návrhu modelu „chatu“, musíte vzít v úvahu, že by mezi uživateli byly miliony zpráv, takže se musíte starat o výkon, když chcete chaty načíst.
Ukládání zpráv do pole není vůbec dobrý nápad, velikost vašeho modelu bude časem velká a musíte vzít v úvahu, že limit velikosti dokumentu MongoDB je aktuálně 16 MB na dokument.
https://docs.mongodb.com/manual/reference/limits/
Za druhé, musíte vzít v úvahu stránkování, protože to ovlivní výkon, když je chat velký, když načtete chat mezi 2 uživateli, nebudete vyžadovat všechny chaty od začátku času, budete pouze požadovat ty nejnovější, a pak si můžete vyžádat ty starší, pokud uživatel posouvá chat, tento aspekt je velmi důležitý a vzhledem k jeho vlivu na výkon ho nelze opomíjet.
Můj přístup bude ukládat každou zprávu do samostatného dokumentu
Za prvé, uložení každé zprávy do jednoho dokumentu zvýší váš výkon při načítání chatů a velikost dokumentu bude velmi malá.
Toto je velmi jednoduchý příklad, musíte změnit model podle svých potřeb, má pouze reprezentovat myšlenku:
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
});
chaty můžete načíst pomocí tohoto dotazu:
Message.find(({ users: { "$in" : [#user1#,#user2#]} })
.sort({ updatedAt: -1 })
.limit(20)
Snadné a čisté! Jak vidíte, stránkování je s tímto přístupem velmi snadné.