Хранение сообщений в новых коллекциях разговоров; MongoDB

#database #mongodb #socket.io #chat

#База данных #mongodb #socket.io #Чат

Вопрос:

Я студент, работаю над приложением для чата для своей стажировки, где я использую socket.io .

Прямо сейчас я занят тем, что думаю о хорошем способе хранения сообщений, отправляемых в разговорах.

На данный момент я делаю следующее:

  • Для каждого разговора между одним пользователем и другим пользователем создается новая коллекция.
  • При каждом отправленном сообщении сообщение сохраняется в соответствующей коллекции разговоров в одном документе.

Коллекции:

Коллекции MongoDB

Где документ выглядит следующим образом:

документ выглядит так

Теперь я задаюсь вопросом, есть ли веский аргумент в пользу того, чтобы иметь только одну коллекцию «разговоров» и хранить все сообщения в нескольких документах, где каждый разговор является новым документом.

Ответ №1:

Создание новой коллекции для каждого сообщения-очень плохая идея, вместо этого вы используете простую схему, приведенную ниже, для хранения ваших сообщений

 const conversation_schema = new Schema({  from: {  type: ObjectID,  ref: 'User'  },  to: {  type: ObjectID,  ref: 'User'  },  messageBody: { // body of the message(text body/ image blob/ video blob)  type: String,  },  messageType: { // type of the message(text, mp3, mp4, etc...)  type: String,  },  read: { // to boolean flag to mark whether the to user has read the message   type: Boolean,  default: false,  },  createdAt: { // when was this message goit created  type: Date,  default: new Date(),  }, });  

вы можете извлечь диалог между двумя пользователями, используя следующий запрос

 conversations.find({  $or: [  {from: 'user1', TO: 'user2},  {from: 'user2', TO: 'user1},  ],  }).populate({ path: 'to', model: User })  .populate({ path: 'from', model: User })  .sort({ createdAt: -1 })