MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose Private Chat Message Model

Nun, auf diese Frage gibt es keine richtige Antwort, aber die von Ihnen genannten Ansätze sind definitiv nicht die besten!

Erstens, wenn Sie darüber nachdenken, ein "Chat"-Modell zu entwerfen, müssen Sie berücksichtigen, dass es Millionen von Nachrichten zwischen den Benutzern geben würde, also müssen Sie sich um die Leistung kümmern, wenn Sie die Chats abrufen möchten.

Das Speichern der Nachrichten in einem Array ist überhaupt keine gute Idee, Ihr Modell wird mit der Zeit groß und Sie müssen berücksichtigen, dass die Dokumentgröße von MongoDB derzeit 16 MB pro Dokument beträgt.

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

Zweitens müssen Sie den Paginierungsaspekt berücksichtigen, da er die Leistung beeinträchtigt, wenn der Chat groß ist. Wenn Sie den Chat zwischen 2 Benutzern abrufen, werden Sie nicht alle Chats seit Beginn der Zeit anfordern, sondern nur anfordern die neusten, und dann können Sie die älteren anfordern, wenn der Benutzer im Chat scrollt, dieser Aspekt ist sehr wichtig und kann aufgrund seiner Auswirkung auf die Leistung nicht vernachlässigt werden.

Mein Ansatz wird sein, jede Nachricht in einem separaten Dokument zu speichern

Erstens wird das Speichern jeder Nachricht in einem einzelnen Dokument Ihre Leistung beim Abrufen der Chats steigern und die Dokumentgröße wird sehr klein sein.

Dies ist ein sehr einfaches Beispiel, Sie müssen das Modell entsprechend Ihren Anforderungen ändern, es soll nur die Idee darstellen:

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

Sie können die Chats mit dieser Abfrage abrufen:

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

Einfach und sauber! Wie Sie sehen, wird die Paginierung mit diesem Ansatz sehr einfach.