Tja, det finns inget korrekt svar på den här frågan, men definitivt, tillvägagångssätten du har nämnt är inte alls de bästa!
För det första, när du funderar på att designa en "chatt"-modell, måste du ta hänsyn till att det skulle finnas miljontals meddelanden mellan användarna, så du måste bry dig om prestanda när du vill hämta chattarna.
Att lagra meddelandena i en array är inte alls en bra idé, din modells storlek kommer att vara stor med tiden och du måste tänka på att MongoDB:s gräns för dokumentstorlek för närvarande är 16 MB per dokument.
https://docs.mongodb.com/manual/reference/limits/
För det andra måste du överväga sideringsaspekten eftersom det kommer att påverka prestandan när chatten är stor, när du hämtar chatten mellan 2 användare kommer du inte att begära alla chattar sedan början av tiden, du kommer bara att begära de senaste, och sedan kan du begära de äldre om användaren rullar chatten, denna aspekt är mycket viktig och kan inte försummas på grund av dess effekt på prestanda.
Min metod kommer att vara att lagra varje meddelande i ett separat dokument
Först och främst, att lagra varje meddelande i ett enda dokument kommer att öka din prestanda under hämtning av chattarna, och dokumentstorleken blir mycket liten.
Detta är ett mycket enkelt exempel, du måste ändra modellen efter dina behov, det är bara för att representera idén:
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
});
du kan hämta chattarna med den här frågan:
Message.find(({ users: { "$in" : [#user1#,#user2#]} })
.sort({ updatedAt: -1 })
.limit(20)
Enkelt och rent! Som du ser blir paginering väldigt lätt med detta tillvägagångssätt.