如何处理 MongoDB 中大量的群聊消息?

Posted

技术标签:

【中文标题】如何处理 MongoDB 中大量的群聊消息?【英文标题】:How to deal with huge amount of group-chat messages in MongoDB? 【发布时间】:2018-12-28 12:24:23 【问题描述】:

我正在构建一个包含不同组的聊天应用程序。因此,我在 Mongodb 中使用了一个集合(一个用于所有组)。这是我的消息架构:

   const MessageSchema = mongoose.Schema(
    groupId: Number,
    userId: Number,
    messageIat: Date,
    message: String,
    reactions: []
  );

假设我想加载 id 为 10 的组的最后 50 条消息。 为了对消息进行排序,我使用了默认的 ObjectId。 我正在使用以下查询。对我来说,似乎我正在加载第 10 组的所有消息,然后对其进行排序以确保顺序,然后我可以限制结果。但这对我来说似乎不是很有效。如果有很多消息,它会花费相当长的时间对吗?

return Message.find(groupId:10).sort( _id: -1 ).limit(50)

我的第一次尝试是一开始做限制操作,但后来我不能依赖顺序,那么常见的方法是什么? 是否更常见的是拆分它,所以每个组都有一个集合?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

According to docs:

对于包含没有索引的排序操作的查询,服务器 必须先加载内存中的所有文档才能执行排序 返回任何结果。

所以首先,请确保 create an index 填写您要对结果进行排序的任何字段。

Also,

有时可以通过按顺序扫描索引来满足排序。如果 查询计划使用索引来提供请求的排序顺序, MongoDB 不会对结果集执行内存排序

此外,根据this page,以下查询是等价的:

db.bios.find().sort(  name: 1  ).limit( 5 )
db.bios.find().limit( 5 ).sort(  name: 1  )

最后,as longs as indices fit entirely in memory,您现在的方法应该没问题。否则,您可能需要考虑进行一些手动分区。

【讨论】:

为了扩展上面的答案,最好的索引是 "groupId" : 1, "_id" : -1 ,因为它包括过滤条件和排序条件(docs.mongodb.com/manual/tutorial/sort-results-with-indexes/…)。

以上是关于如何处理 MongoDB 中大量的群聊消息?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 连接如何处理 NodeJS express 服务器中的并发请求?

如何处理MongoDB中的多对多关系?

如何处理 MongoDB / Morphia 中的查询迁移?

我们如何处理 MongoDB 连接、模式?

如何处理大型mongodb集合

在centos 7上安装mongodb时如何处理这个问题?