我正在使用 node.js
, redis
, socket.io
和 mongodb
开发一个聊天应用程序。MongoDB 用于存储消息。
我的问题是,在最后一步中,最好的方法是什么?
我担心像这样拥有所有消息的集合:
{
id,
from,
to,
datetime,
message
}
如果网页内容过大,加载速度会变得非常缓慢,您怎么看?
您是否有更好的解决方案?
我正在使用 node.js
, redis
, socket.io
和 mongodb
开发一个聊天应用程序。MongoDB 用于存储消息。
我的问题是,在最后一步中,最好的方法是什么?
我担心像这样拥有所有消息的集合:
{
id,
from,
to,
datetime,
message
}
如果网页内容过大,加载速度会变得非常缓慢,您怎么看?
您是否有更好的解决方案?
在MongoDB中,您以您稍后要读取的格式存储数据。
如果您从数据库中读取的是按“to”字段过滤并带有动态日期时间筛选器的消息列表,则此架构是完美的选择。
不要忘记在您将进行查询的字段上添加索引,那么即使对数百万条记录进行查询,它们也会相对较快地查询。
例如,如果您总是显示整个一天的完整历史记录,则会将单个日子的所有消息存储在一个文档中。 如果两种类型的查询都经常发生,则甚至可以以两种格式存储消息。
如果存储是一个问题,您还可以使用固定集合,其将自动删除超过1年的消息。
我认为你在问题中提到的数据库结构是合适的。
你可以为每对聊天分配一个唯一的id
,并将其保存在每个聊天记录中。当你想要显示聊天记录时,就可以根据这个唯一的id
进行检索。
比如说,12
是A和B之间的聊天唯一标识符,当你想要为A和B显示聊天记录时,应该基于12
进行检索。
所以你的数据库结构可以像这样:
{
id,
from,
to,
datetime,
message,
uid
}
记住,如果你为检索设置一些限制(比如每次100条),你可以使其优化。如果用户滚动超过100,则获取更多的100个聊天记录。这将解决许多检索问题。
使用limit时,基于“创建日期”进行检索,并在查询中使用sort。
这里有一个想法,消息是纯文本还是允许分享图片和视频的?
如果是后者,那么将所有聊天记录存储在一个集合中可能行不通。
实际上,如果允许共享图像和视频,则还需要考虑16mb文档限制。