MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Modèle de message de chat privé Mongoose

Eh bien, il n'y a pas de bonne réponse à cette question, mais certainement, les approches que vous avez mentionnées ne sont pas du tout les meilleures !

Tout d'abord, lorsque vous envisagez de concevoir un modèle de "chat", vous devez tenir compte du fait qu'il y aurait des millions de messages entre les utilisateurs, vous devez donc vous soucier des performances lorsque vous souhaitez récupérer les chats.

Stocker les messages dans un tableau n'est pas du tout une bonne idée, la taille de votre modèle sera importante avec le temps et vous devez considérer que la limite de taille de document de MongoDB est actuellement de 16 Mo par document.

https://docs.mongodb.com/manual/reference/limits/

Deuxièmement, vous devez tenir compte de l'aspect de la pagination car cela affectera les performances lorsque le chat est volumineux, lorsque vous récupérez le chat entre 2 utilisateurs, vous ne demanderez pas tous les chats depuis le début du temps, vous demanderez simplement les plus récents, puis vous pouvez demander les plus anciens si l'utilisateur fait défiler le chat, cet aspect est très important et ne peut être négligé en raison de son effet sur les performances.

Mon approche consistera à stocker chaque message dans un document séparé

Tout d'abord, stocker chaque message dans un seul document augmentera vos performances lors de la récupération des chats, et la taille du document sera très petite.

C'est un exemple très simple, vous devez changer le modèle selon vos besoins, c'est juste pour représenter l'idée :

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
});

vous pouvez récupérer les chats avec cette requête :

 Message.find(({ users: { "$in" : [#user1#,#user2#]} })
    .sort({ updatedAt: -1 })
    .limit(20)

Facile et propre ! Comme vous le voyez, la pagination devient très facile avec cette approche.