将聊天消息存储在 mongodb 集合中是个好主意吗?

Is a good idea to store chat messages in a mongodb collection?

我正在使用 node.jsredissocket.iomongodb 开发聊天应用程序。 MongoDB 排在最后,用于保留消息。

我的问题是最后一步的最佳方法是什么?

恐怕要收集所有类似

的消息
{
    id,
    from,
    to,
    datetime,
    message
}

很快就会变得太大,而且阅读速度会变得很慢,您怎么看?

您是否已经使用过更好的方法?

在 MongoDB 中,您以稍后要阅读的格式存储数据。

如果您从数据库中读取的是在 'to' 字段上过滤并使用动态日期时间过滤器的消息列表,那么此架构非常适合。

不要忘记在您要查询的字段上添加索引,这样查询它们的速度就会相当快,即使超过数百万条记录也是如此。

例如,如果您始终显示一整天的完整历史记录,则可以将一天的所有消息存储在一个文档中。如果两种类型的查询都经常出现,您甚至可以将消息以两种格式存储。

如果存储是个问题,您还可以使用上限集合,它会自动删除消息,例如1岁以上

我认为数据库结构很好,就像你在问题中提到的那样。

您可以分配一些 unique id 用于每对之间的聊天,并将其保存在每条聊天记录中。当你想显示它时,根据它进行检索。

12是A和B聊天的唯一id,要显示A和B的聊天时要根据12检索

所以你的数据库结构可以是这样的:-

{
    id,
    from,
    to,
    datetime,
    message,
    uid
}

请记住,如果您提供一些 limit(比如一次 100 个)用于检索,您可以优化检索。如果用户滚动超过 100 个,则检索更多 100 个聊天记录。这将解决很多检索问题。

当使用 limit 时,基于 date created 检索并使用 sort 进行查找查询。

这里只是想一想,消息是纯文本还是您也可以共享图片和视频?

如果是后者,那么将一天的所有聊天记录存储在一个集合中可能行不通。

实际上,如果您允许分享图片和视频,那么您需要考虑。还有 16mb 文件限制。