Bem, não há resposta correta para esta pergunta, mas definitivamente, as abordagens que você mencionou não são as melhores!
Primeiro, quando você está pensando em criar um modelo de "chat", você precisa levar em conta que haveria milhões de mensagens entre os usuários, então você precisa se preocupar com o desempenho quando quiser buscar os chats.
Armazenar as mensagens em uma matriz não é uma boa ideia, o tamanho do seu modelo será grande no momento e você deve considerar que o limite de tamanho do documento do MongoDB é atualmente de 16 MB por documento.
https://docs.mongodb.com/manual/reference/limits/
Em segundo lugar, você deve considerar o aspecto da paginação porque afetará o desempenho quando o bate-papo for grande, quando você recuperar o bate-papo entre 2 usuários não solicitará todos os bate-papos desde o início do tempo, apenas solicitará os mais recentes, e então você pode solicitar os mais antigos se o usuário rolar o chat, este aspecto é muito importante e não pode ser negligenciado devido ao seu efeito no desempenho.
Minha abordagem será armazenar cada mensagem em um documento separado
Em primeiro lugar, armazenar cada mensagem em um único documento aumentará seu desempenho durante a busca dos bate-papos, e o tamanho do documento será muito pequeno.
Este é um exemplo muito simples, você precisa alterar o modelo de acordo com suas necessidades, é apenas para representar a ideia:
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
});
você pode buscar os bate-papos por esta consulta:
Message.find(({ users: { "$in" : [#user1#,#user2#]} })
.sort({ updatedAt: -1 })
.limit(20)
Fácil e limpo! como você vê, a paginação se torna muito fácil com essa abordagem.