#database #mongodb #socket.io #chat
#База данных #mongodb #socket.io #Чат
Вопрос:
Я студент, работаю над приложением для чата для своей стажировки, где я использую socket.io
.
Прямо сейчас я занят тем, что думаю о хорошем способе хранения сообщений, отправляемых в разговорах.
На данный момент я делаю следующее:
- Для каждого разговора между одним пользователем и другим пользователем создается новая коллекция.
- При каждом отправленном сообщении сообщение сохраняется в соответствующей коллекции разговоров в одном документе.
Коллекции:
Где документ выглядит следующим образом:
Теперь я задаюсь вопросом, есть ли веский аргумент в пользу того, чтобы иметь только одну коллекцию «разговоров» и хранить все сообщения в нескольких документах, где каждый разговор является новым документом.
Ответ №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 })