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

时间:2018-12-28 12:24:24

标签: node.js mongodb performance sorting chat

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

答案 0 :(得分:2)

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,您可以使用当前的方法。否则,您可能需要考虑进行一些手动分区。