sql >> Databáze >  >> NoSQL >> MongoDB

Model zprávy soukromého chatu Mongoose

No, na tuto otázku neexistuje správná odpověď, ale rozhodně, přístupy, které jste zmínil, nejsou vůbec nejlepší!

Za prvé, když přemýšlíte o návrhu modelu „chatu“, musíte vzít v úvahu, že by mezi uživateli byly miliony zpráv, takže se musíte starat o výkon, když chcete chaty načíst.

Ukládání zpráv do pole není vůbec dobrý nápad, velikost vašeho modelu bude časem velká a musíte vzít v úvahu, že limit velikosti dokumentu MongoDB je aktuálně 16 MB na dokument.

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

Za druhé, musíte vzít v úvahu stránkování, protože to ovlivní výkon, když je chat velký, když načtete chat mezi 2 uživateli, nebudete vyžadovat všechny chaty od začátku času, budete pouze požadovat ty nejnovější, a pak si můžete vyžádat ty starší, pokud uživatel posouvá chat, tento aspekt je velmi důležitý a vzhledem k jeho vlivu na výkon ho nelze opomíjet.

Můj přístup bude ukládat každou zprávu do samostatného dokumentu

Za prvé, uložení každé zprávy do jednoho dokumentu zvýší váš výkon při načítání chatů a velikost dokumentu bude velmi malá.

Toto je velmi jednoduchý příklad, musíte změnit model podle svých potřeb, má pouze reprezentovat myšlenku:

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

chaty můžete načíst pomocí tohoto dotazu:

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

Snadné a čisté! Jak vidíte, stránkování je s tímto přístupem velmi snadné.



  1. Jak uložit datum a čas v Meteoru pro dotazy na rozsah?

  2. pymongo získává E11000 duplicitní klíčový chybový index Chyba pymongo

  3. MongoDB sort()

  4. Nové výsledky Mongoose QueryStream