Mongoose Private Chat Message Model

后端 未结 2 430
情书的邮戳
情书的邮戳 2021-02-03 15:24

I\'m trying to add private messaging between users into my data model. I\'ve been going back and forth between two possible ways of doing this.

1) Each user has an ar

2条回答
  •  既然无缘
    2021-02-03 16:16

    Well, there is no correct answer to this question, But definitely, the approaches you have mentioned are not the best at all!

    Firstly, when you are thinking about designing a "chat" model, you need to take into account that there would be millions of messages between the users, so you need to care about performance when you want to fetch the chats.

    Storing the messages into an array is not a good idea at all, your model's size will be large by the time and you have to consider that MongoDB's document size limit is currently 16 MB per document.

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

    Secondly, You have to consider pagination aspect because it will affect the performance when the chat is large, when you retrieve the chat between 2 users you won't request all the chats since the beginning of the time, you will just request the most recent ones, and then you can request the older ones if the user scroll the chat, this aspect is very important and can't be neglected due to its effect on performance.

    My approach will be to store each message in a separated document

    First of all, storing each message in a single document will boost your performance during fetching the chats, and the document size will be very small.

    This is a very simple example, you need to change the model according to your needs, it is just to represent the 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
    });
    

    you can fetch the chats by this query:

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

    Easy and clean! as you see, pagination becomes very easy with this approach.

提交回复
热议问题