如何处理 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 服务器中的并发请求?