Mongoose Private Chat Message Model

后端 未结 2 400
情书的邮戳
情书的邮戳 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 15:59

    A few suggestions.

    First - why store Participant1 and 2 as arrays? There is one specific sender, and one (or more) recipients (depending on if you want group messages).

    Consider the following Schema:

    var ChatSchema = new Schema({
        sender : {
            type : mongoose.Schema.Types.ObjectId,
            ref : 'User'
        },
        messages : [
            {
                message : String,
                meta : [
                    {
                        user : {
                            type : mongoose.Schema.Types.ObjectId,
                            ref : 'User'
                        },
                        delivered : Boolean,
                        read : Boolean
                    }
                ]
            }
        ],
        is_group_message : { type : Boolean, default : false },
        participants : [
            {
                user :  {
                    type : mongoose.Schema.Types.ObjectId,
                    ref : 'User'
                },
                delivered : Boolean,
                read : Boolean,
                last_seen : Date
            }
        ]
    });
    

    This schema allows one chat document to store all messages, all participants, and all statuses related to each message and each participant.

    the Boolean is_group_message is just a shorter way to filter which are direct / group messages, maybe for client side viewing or server-side processing. Direct messages are obviously easier to work with query-wise, but both are pretty simple.

    the meta array lists the delivered/read status, etc, for each participant of a single message. If we weren't handling group messages, this wouldn't need to be an array, but we are, so that's fine.

    the delivered and read properties on the main document (not the meta subdocument) are also just shorthand ways of telling if the last message was delivered/read or not. They're updated on each write to the document.

    This schema allows us to store everything about a chat in one document. Even group chats.

提交回复
热议问题