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

Modello di messaggio di chat privata di Mongoose

Bene, non esiste una risposta corretta a questa domanda, ma sicuramente gli approcci che hai menzionato non sono affatto i migliori!

In primo luogo, quando stai pensando di progettare un modello di "chat", devi tenere conto del fatto che ci sarebbero milioni di messaggi tra gli utenti, quindi devi preoccuparti delle prestazioni quando vuoi recuperare le chat.

Memorizzare i messaggi in un array non è affatto una buona idea, le dimensioni del tuo modello saranno grandi nel tempo e devi considerare che il limite di dimensione del documento di MongoDB è attualmente di 16 MB per documento.

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

In secondo luogo, devi considerare l'aspetto dell'impaginazione perché influenzerà le prestazioni quando la chat è grande, quando recuperi la chat tra 2 utenti non richiederai tutte le chat dall'inizio del tempo, ti limiterai a richiedere quelli più recenti, e poi puoi richiedere quelli più vecchi se l'utente scorre la chat, questo aspetto è molto importante e non può essere trascurato per il suo effetto sulle prestazioni.

Il mio approccio sarà quello di archiviare ogni messaggio in un documento separato

Innanzitutto, la memorizzazione di ogni messaggio in un unico documento aumenterà le tue prestazioni durante il recupero delle chat e le dimensioni del documento saranno molto ridotte.

Questo è un esempio molto semplice, devi cambiare il modello in base alle tue esigenze, è solo per rappresentare l'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
});

puoi recuperare le chat con questa query:

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

Facile e pulito! Come vedi, l'impaginazione diventa molto semplice con questo approccio.