Е, няма правилен отговор на този въпрос, но определено подходите, които споменахте, изобщо не са най-добрите!
Първо, когато мислите за проектиране на модел на „чат“, трябва да вземете предвид, че ще има милиони съобщения между потребителите, така че трябва да се грижите за производителността, когато искате да извлечете чатовете.силен>
Съхраняването на съобщенията в масив изобщо не е добра идея, размерът на вашия модел ще бъде голям с течение на времето и трябва да вземете предвид, че ограничението за размера на документа на MongoDB в момента е 16 MB на документ.
https://docs.mongodb.com/manual/reference/limits/
Второ, трябва да имате предвид аспекта на пагинацията, защото това ще повлияе на производителността, когато чатът е голям, когато извлечете чата между 2 потребители, няма да поискате всички чатове от началото на времето, а просто ще поискате най-новите и след това можете да поискате по-старите, ако потребителят превърти чата, този аспект е много важен и не може да бъде пренебрегнат поради ефекта му върху производителността.
Моят подход ще бъде да съхранявам всяко съобщение в отделен документ
На първо място, съхраняването на всяко съобщение в един документ ще подобри ефективността ви по време на извличане на чатовете, а размерът на документа ще бъде много малък.
Това е много прост пример, трябва да промените модела според вашите нужди, той е само за да представи идеята:
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
});
можете да извлечете чатовете чрез тази заявка:
Message.find(({ users: { "$in" : [#user1#,#user2#]} })
.sort({ updatedAt: -1 })
.limit(20)
Лесно и чисто! както виждате, пагинирането става много лесно с този подход.