sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongoose Private Chat Message Model

Nå, der er ikke noget korrekt svar på dette spørgsmål, men bestemt, de tilgange, du har nævnt, er slet ikke de bedste!

For det første, når du overvejer at designe en "chat"-model, skal du tage højde for, at der ville være millioner af beskeder mellem brugerne, så du skal bekymre dig om ydeevne, når du vil hente chattene.

Det er slet ikke en god idé at gemme meddelelserne i et array, din models størrelse vil være stor med tiden, og du skal overveje, at MongoDB's grænse for dokumentstørrelse i øjeblikket er 16 MB pr. dokument.

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

For det andet skal du overveje pagineringsaspektet, fordi det vil påvirke ydeevnen, når chatten er stor, når du henter chatten mellem 2 brugere, vil du ikke anmode om alle chats siden begyndelsen af ​​tiden, du vil bare anmode om de seneste, og så kan du anmode om de ældre, hvis brugeren ruller i chatten, dette aspekt er meget vigtigt og kan ikke negligeres på grund af dets effekt på ydeevnen.

Min tilgang vil være at gemme hver besked i et separat dokument

Først og fremmest vil lagring af hver besked i et enkelt dokument øge din ydeevne under hentning af chattene, og dokumentstørrelsen vil være meget lille.

Dette er et meget simpelt eksempel, du skal ændre modellen efter dine behov, det er bare for at repræsentere ideen:

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

du kan hente chats ved denne forespørgsel:

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

Nemt og rent! Som du kan se, bliver paginering meget let med denne tilgang.



  1. MongoDB GridFS VS Direkte disk IO

  2. Hvordan vælger man et enkelt felt til alle dokumenter i en MongoDB-samling?

  3. MongoDB 'kan ikke finde indeks for $geoNear-forespørgsel'

  4. Får fejl, når jeg installerer MongoDB på RedHat