【问题标题】:Is a good idea to store chat messages in a mongodb collection?将聊天消息存储在 mongodb 集合中是个好主意吗?
【发布时间】:2016-12-10 11:34:06
【问题描述】:

我正在与node.jsredissocket.iomongodb 一起开发一个聊天应用程序。 MongoDB 是最后一个,用于持久化消息。

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

恐怕是一个包含所有消息的集合

{
    id,
    from,
    to,
    datetime,
    message
}

可能会很快变得太大,并且会变得非常慢以用于阅读目的,您怎么看?

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

【问题讨论】:

  • 只能在两个人之间聊天,或者也可以在一群人之间聊天?

标签: mongodb database-design chat bigdata


【解决方案1】:

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

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

不要忘记在要查询的字段上添加索引,这样查询它们会相当快,甚至超过数百万条记录。

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

如果存储是一个问题,您还可以使用 capped collection,它会自动删除消息,例如1岁以上。

【讨论】:

  • 谢谢,正是有上限的事情是我在思考,不知道该怎么做,谢谢你的信息
【解决方案2】:

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

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

假设12是A和B聊天的唯一ID,当你想显示A和B的聊天时,检索应该基于12

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

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

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

使用limit 时,根据date created 进行检索,并将sort 与查找查询一起使用。

【讨论】:

  • 我认为不需要存储uid。因为 mongoDB 提供 _id 它总是唯一的
  • @jitendrarajput uid 将用于轻松检索数据,否则您将在两个用户之间获取消息时遇到一些困难
  • @Shrabanee 当我不存储 uid 并且我将不得不获取两个用户之间的聊天时我应该怎么做?我认为这可能与 mongo 侵略有关
【解决方案3】:

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

如果是后者,那么将一天内的所有聊天记录在一个集合中可能不会奏效。

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

【讨论】:

  • 它现在只是文本,但考虑到未来,这是一个很好的观点
  • 将媒体存储在数据库中真的是个好主意吗?我认为这永远不会发生
猜你喜欢
  • 2013-06-24
  • 2023-03-26
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2010-10-30
  • 1970-01-01
  • 2018-11-18
相关资源
最近更新 更多