Cóż, nie ma prawidłowej odpowiedzi na to pytanie, ale zdecydowanie podejścia, o których wspomniałeś, wcale nie są najlepsze!
Po pierwsze, gdy myślisz o zaprojektowaniu modelu „czatu”, musisz wziąć pod uwagę, że między użytkownikami będą miliony wiadomości, więc musisz zadbać o wydajność, gdy chcesz pobrać czaty.
Przechowywanie wiadomości w tablicy nie jest wcale dobrym pomysłem, rozmiar twojego modelu będzie do tego czasu duży i musisz wziąć pod uwagę, że limit rozmiaru dokumentu MongoDB wynosi obecnie 16 MB na dokument.
https://docs.mongodb.com/manual/reference/limits/
Po drugie, musisz wziąć pod uwagę aspekt paginacji, ponieważ wpłynie to na wydajność, gdy czat jest duży, kiedy pobierzesz czat między 2 użytkownikami, nie będziesz prosić o wszystkie czaty od początku czasu, po prostu poprosisz najnowsze, a następnie możesz poprosić o starsze, jeśli użytkownik przewinie czat, ten aspekt jest bardzo ważny i nie można go pominąć ze względu na jego wpływ na wydajność.
Moje podejście polega na przechowywaniu każdej wiadomości w oddzielnym dokumencie
Po pierwsze, przechowywanie każdej wiadomości w jednym dokumencie zwiększy Twoją wydajność podczas pobierania czatów, a rozmiar dokumentu będzie bardzo mały.
To bardzo prosty przykład, musisz zmienić model zgodnie ze swoimi potrzebami, to tylko przedstawienie pomysłu:
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
});
możesz pobrać czaty za pomocą tego zapytania:
Message.find(({ users: { "$in" : [#user1#,#user2#]} })
.sort({ updatedAt: -1 })
.limit(20)
Łatwo i przejrzyście! Jak widać, przy takim podejściu podział na strony staje się bardzo łatwy.