首页 > 解决方案 > 如何处理 MongoDB 中大量的群聊消息?

问题描述

我正在与不同的组构建一个聊天应用程序。因此,我在 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)

我的第一次尝试是一开始做限制操作,但后来我不能依赖订单,那么这个commen方式是什么?将其拆分是否更常见,因此每个组都有一个集合?

感谢您的帮助。

标签: node.jsmongodbperformancesortingchat

解决方案


根据文档

对于包含不带索引的排序操作的查询,服务器必须在返回任何结果之前加载内存中的所有文档以执行排序。

因此,首先,请确保为要对结果进行排序的任何字段创建索引。

还有

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

此外,根据此页面,以下查询是等效的:

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

最后,只要索引完全适合 memory,您就可以使用当前的方法。否则,您可能需要考虑进行一些手动分区。


推荐阅读