Подходит ли вложенный массив mongodb с очень длинным хранилищем - PullRequest
0 голосов
/ 04 сентября 2018

Я создал систему чата, и ожидается, что вся информация в чате будет храниться в Документе MongoDB. Каждое отправленное сообщение добавляется в массив сообщений комнаты.

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

enter image description here

Этот блог считает, что это правильное хранилище.

Но официальная документация гласит, что каждый документ не может быть больше 16 МБ

  • разумен ли дизайн хранилища?
  • есть ли другой лучший дизайн?

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Как продолжение моего собственного вопроса:

Мне нужно контролировать длину комнатных сообщений, чтобы она была меньше 100, аналогично методу очереди, первым пришел, первым вышел.

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

query := bson.M{
    "room_customer.customer_id": msg.FromUserName,
}
changes := bson.M{
    "$push": bson.M{"room_messages": bson.M{"$each": []model.RoomMessage{
        {    
            Msg:        msgText,
            CreateTime: time.Now(),
        },
    },
    "$slice": -100}},
}
roomCollection.Update(query, changes)

Таким образом, вы можете вести запись чата в комнате разговоров до 100 сообщений всегда, я надеюсь, что это будет полезно для людей, которые сталкиваются с подобными проблемами!

0 голосов
/ 04 сентября 2018

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

По поводу лимита в 16МБ, я думаю, это нормально.

В любом случае, я бы не стал хранить всю историю сообщений внутри документа по соображениям производительности (запрос может стать очень медленным, если у вас очень заняты чаты), но я бы ограничил размер списка чатов, давайте скажем 100 элементов (самые последние), и я бы использовал другой подход для резервного копирования всей истории чата.

...