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

9

我正在使用 node.js, redis, socket.iomongodb 开发一个聊天应用程序。MongoDB 用于存储消息。

我的问题是,在最后一步中,最好的方法是什么?

我担心像这样拥有所有消息的集合:

{
    id,
    from,
    to,
    datetime,
    message
}

如果网页内容过大,加载速度会变得非常缓慢,您怎么看?

您是否有更好的解决方案?


聊天是只有两个人之间的,还是也可以有一组人? - Shrabanee
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
14

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

如果您从数据库中读取的是按“to”字段过滤并带有动态日期时间筛选器的消息列表,则此架构是完美的选择。

不要忘记在您将进行查询的字段上添加索引,那么即使对数百万条记录进行查询,它们也会相对较快地查询。

例如,如果您总是显示整个一天的完整历史记录,则会将单个日子的所有消息存储在一个文档中。 如果两种类型的查询都经常发生,则甚至可以以两种格式存储消息。

如果存储是一个问题,您还可以使用固定集合,其将自动删除超过1年的消息。


谢谢,确切地说,大写的问题是我一直在思考并不知道如何解决的,感谢您提供的信息。 - R01010010

8

我认为你在问题中提到的数据库结构是合适的。

你可以为每对聊天分配一个唯一的id,并将其保存在每个聊天记录中。当你想要显示聊天记录时,就可以根据这个唯一的id进行检索。

比如说,12是A和B之间的聊天唯一标识符,当你想要为A和B显示聊天记录时,应该基于12进行检索。

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

{
    id,
    from,
    to,
    datetime,
    message,
    uid
}
记住,如果你为检索设置一些限制(比如每次100条),你可以使其优化。如果用户滚动超过100,则获取更多的100个聊天记录。这将解决许多检索问题。 使用limit时,基于“创建日期”进行检索,并在查询中使用sort。

3
我认为不需要存储uid。因为MongoDB提供的_id始终是唯一的。 - jitendra rajput
@jitendrarajput uid将被用于轻松检索数据,否则在获取两个用户之间的消息时会遇到一些困难。 - Ishwar Chandra Tiwari
@Shrabanee 如果我没有存储uid,而我需要获取两个用户之间的聊天记录,我该怎么办?我认为可以使用Mongo Aggregation实现。 - Ishwar Chandra Tiwari

1

这里有一个想法,消息是纯文本还是允许分享图片和视频的?

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

实际上,如果允许共享图像和视频,则还需要考虑16mb文档限制。


目前只需要翻译文本,但这也是未来考虑的一个好点。 - R01010010
将媒体存储在数据库中是否真的是一个好主意?我认为这永远都不应该发生。 - alimfazeli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,