适合长时间存储的mongodb嵌套数组是否合适

时间:2018-09-04 10:01:10

标签: arrays mongodb chat limit

  

我创建了一个聊天系统,并且聊天室中的所有信息都希望通过MongoDB的文档存储。 每条发送的消息都会附加到会议室消息数组中。

数据结构如下:

enter image description here

blog认为这是正确的存储空间。

但是the official documentation说每个文档不能超过16 MB

  • 存储设计合理吗?
  • 还有其他更好的设计吗?

2 个答案:

答案 0 :(得分:1)

这实际上取决于您将如何查询数据,但是我认为设计还可以。 将所有消息包含在聊天文档中将确保您保持一致性并确保有关并发问题的聊天安全。

大约16MB的限制,我认为还可以。

无论如何,出于性能方面的考虑,我不会将整个消息的历史记录保留在文档中(如果您有非常繁忙的聊天室,查询可能会变得很慢),但是我将聊天列表的大小限制为比如说100个元素(最新的元素),我将使用另一种方法来备份整个聊天室的历史记录。

答案 1 :(得分:0)

作为我自己的问题的后续行动:

  

我需要将会议室消息的长度控制为小于100,类似于队列先进先出方法。

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条消息的对话室聊天记录,希望对遇到类似问题的人有所帮助!