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

R01*_*010 4 database-design chat bigdata mongodb

我正在开发一个聊天应用node.js,redis,socket.iomongodb.MongoDB是最后一个,用于持久化消息.

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

我害怕收集包含所有信息的集合

{
    id,
    from,
    to,
    datetime,
    message
}
Run Code Online (Sandbox Code Playgroud)

太快会变得太大,而且阅读目的会变得很慢,你怎么看?

你有没有更好的方法?

Gee*_*nte 8

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

如果您从数据库中读取的内容是在"到"字段和动态日期时间过滤器上过滤的消息列表,那么此模式非常适合.

不要忘记在要查询的字段上添加索引,然后查询它们是合理的,甚至超过数百万条记录.

例如,如果您要显示一整天的完整历史记录,则可以将一天中的所有消息存储在一个文档中.如果两种类型的查询都发生很多,您甚至会以两种格式存储邮件.

如果存储是个问题,您还可以使用上限集合,这将自动删除例如超过1年的消息.


Shr*_*nee 6

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

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

12是 A 和 B 之间聊天的唯一 ID,检索应该基于12您想显示 A 和 B 的聊天的时间。

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

{
    id,
    from,
    to,
    datetime,
    message,
    uid
}
Run Code Online (Sandbox Code Playgroud)

请记住,您可以优化您的检索,如果您愿意提供一些limit(例如一次 100 个)进行检索。如果用户滚动超过 100 次,则检索更多 100 次聊天。这将解决大量检索。

使用时limit,检索也基于查找查询date createdsort与查找查询一起使用。

  • 我认为没有必要存储 uid。因为 mongoDB 提供 _id 它总是唯一的 (2认同)