I made a chat system, and all the information in the chatroom is expected to be stored through MongoDB's Document. Each message sent is appended to the room messages array.
Структура данных следующая:
Этот блог считает, что это правильное хранилище.
Но официальная документация говорит, что каждый документ не может быть больше 16 МБ.



Это действительно зависит от того, как вы будете запрашивать данные, но я думаю, что дизайн в порядке. Наличие всех сообщений в документе чата гарантирует согласованность и безопасность ваших чатов в отношении проблем параллелизма.
Насчет лимита в 16МБ, думаю, вполне нормально.
В любом случае, я бы не стал хранить всю историю сообщений внутри документа по соображениям производительности (запрос может стать очень медленным, если у вас очень загруженные чаты), но я бы ограничил размер списка чатов, скажем, 100 элементами. (самые последние), и я бы использовал другой подход для резервного копирования всей истории чата.
В продолжение моего собственного вопроса:
I need to control the length of room messages to be less than 100, similar to the queue, first-in, first-out method.
Пример кода для golang выглядит следующим образом:
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 сообщений чата в комнате для разговоров, я надеюсь, что это будет полезно для людей, которые сталкиваются с подобными проблемами!
Спасибо за ваш комментарий. Я смогу справиться с текущим ограничением размера, перенеся историю чата.