我正在与node.js
,redis
,socket.io
和mongodb
开发聊天应用。 MongoDB是最后一个,用于持久化消息。
我的问题是最后一步的最佳方法是什么?
我害怕收藏所有信息,例如
{
id,
from,
to,
datetime,
message
}
太快会变得太大,读起来会变得很慢,你怎么看?
你有没有更好的方法?
答案 0 :(得分:8)
在MongoDB中,您将以稍后要阅读的格式存储数据。
如果您从数据库中读取的内容是在“到”字段和动态日期时间过滤器上过滤的消息列表,那么此模式非常适合。
不要忘记在您要查询的字段上添加索引,然后查询它们是合理的,甚至超过数百万条记录。
例如,如果您要显示一整天的完整历史记录,则可以将一天中的所有消息存储在一个文档中。如果两种类型的查询都发生很多,您甚至可以以两种格式存储邮件。
如果存储存在问题,您还可以使用上限集合,该集合会自动删除例如超过1岁。
答案 1 :(得分:2)
我认为db结构很好,就像你在问题中提到的那样。
您可以为每对之间的聊天分配一些unique id
,并将其保留在每个聊天记录中。当您想要显示它时,根据它进行检索。
说12
是A和B之间聊天的唯一ID,当您想要显示A和B的聊天时,检索应该基于12
。
所以你的数据库结构可以是: -
{
id,
from,
to,
datetime,
message,
uid
}
请记住,如果您要提供一些limit
(例如每次100个)进行检索,则可以优化检索。如果用户滚动超过100,则检索更多100个聊天。这将解决大量的检索。
使用limit
时,请根据date created
进行检索,并使用sort
查找查询。
答案 2 :(得分:0)
这里只是一个想法,是纯文本消息还是允许您共享图像和视频?
如果是后者,那么将一天中的所有聊天记录存储在一个集合中可能无法解决。
实际上,如果您允许图像和视频共享,那么您需要考虑到。 16mb文件限制。