MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Model prywatnej wiadomości czatu Mongoose

Cóż, nie ma prawidłowej odpowiedzi na to pytanie, ale zdecydowanie podejścia, o których wspomniałeś, wcale nie są najlepsze!

Po pierwsze, gdy myślisz o zaprojektowaniu modelu „czatu”, musisz wziąć pod uwagę, że między użytkownikami będą miliony wiadomości, więc musisz zadbać o wydajność, gdy chcesz pobrać czaty.

Przechowywanie wiadomości w tablicy nie jest wcale dobrym pomysłem, rozmiar twojego modelu będzie do tego czasu duży i musisz wziąć pod uwagę, że limit rozmiaru dokumentu MongoDB wynosi obecnie 16 MB na dokument.

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

Po drugie, musisz wziąć pod uwagę aspekt paginacji, ponieważ wpłynie to na wydajność, gdy czat jest duży, kiedy pobierzesz czat między 2 użytkownikami, nie będziesz prosić o wszystkie czaty od początku czasu, po prostu poprosisz najnowsze, a następnie możesz poprosić o starsze, jeśli użytkownik przewinie czat, ten aspekt jest bardzo ważny i nie można go pominąć ze względu na jego wpływ na wydajność.

Moje podejście polega na przechowywaniu każdej wiadomości w oddzielnym dokumencie

Po pierwsze, przechowywanie każdej wiadomości w jednym dokumencie zwiększy Twoją wydajność podczas pobierania czatów, a rozmiar dokumentu będzie bardzo mały.

To bardzo prosty przykład, musisz zmienić model zgodnie ze swoimi potrzebami, to tylko przedstawienie pomysłu:

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

możesz pobrać czaty za pomocą tego zapytania:

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

Łatwo i przejrzyście! Jak widać, przy takim podejściu podział na strony staje się bardzo łatwy.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. obsługuj @ w ciągu połączenia mongodb

  2. MongoDb $lookup zapytanie z wieloma polami z tablicy obiektów

  3. Potok agregacji Mongodb, jak ograniczyć grupowe push

  4. Usuń element z tablicy w mongodb

  5. MongoDB - pomoc z zapytaniem PHP