sql >> Base de Datos >  >> NoSQL >> MongoDB

Modelo de mensaje de chat privado de Mongoose

Bueno, no hay una respuesta correcta a esta pregunta, pero definitivamente, ¡los enfoques que ha mencionado no son los mejores en absoluto!

En primer lugar, cuando piense en diseñar un modelo de "chat", debe tener en cuenta que habrá millones de mensajes entre los usuarios, por lo que debe preocuparse por el rendimiento cuando desee recuperar los chats.

Almacenar los mensajes en una matriz no es una buena idea en absoluto, el tamaño de su modelo será grande en el momento y debe tener en cuenta que el límite de tamaño de documento de MongoDB es actualmente de 16 MB por documento.

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

En segundo lugar, debe considerar el aspecto de la paginación porque afectará el rendimiento cuando el chat sea grande, cuando recupere el chat entre 2 usuarios, no solicitará todos los chats desde el comienzo del tiempo, solo solicitará los más recientes, y luego puede solicitar los más antiguos si el usuario hace scroll en el chat, este aspecto es muy importante y no puede pasarse por alto debido a su efecto en el rendimiento.

Mi enfoque será almacenar cada mensaje en un documento separado

En primer lugar, almacenar cada mensaje en un solo documento mejorará su rendimiento durante la obtención de los chats y el tamaño del documento será muy pequeño.

Este es un ejemplo muy simple, necesita cambiar el modelo de acuerdo a sus necesidades, es solo para representar la idea:

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

Puede obtener los chats con esta consulta:

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

¡Fácil y limpio! Como puede ver, la paginación se vuelve muy fácil con este enfoque.