首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MongoDB中处理海量群聊消息?

如何在MongoDB中处理海量群聊消息?
EN

Stack Overflow用户
提问于 2018-12-28 20:24:24
回答 1查看 324关注 0票数 1

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

代码语言:javascript
复制
   const MessageSchema = mongoose.Schema({
    groupId: Number,
    userId: Number,
    messageIat: Date,
    message: String,
    reactions: []
  });

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

代码语言:javascript
复制
return Message.find({groupId:10}).sort( {_id: -1 }).limit(50)

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

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-12-28 20:55:57

According to docs

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

因此,首先,确保对要排序结果的任何字段使用create an index

Also

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

此外,根据this page的说法,以下查询是等效的:

代码语言:javascript
复制
db.bios.find().sort( { name: 1 } ).limit( 5 )
db.bios.find().limit( 5 ).sort( { name: 1 } )

最后,as longs as indices fit entirely in memory,您应该可以接受您当前的方法。否则,您可能需要考虑进行一些手动分区。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53958574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档