我正在构建一个与不同群组的聊天应用程序。因此,我在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)我的第一次尝试是先做极限操作,但后来我不能依靠顺序,那么常见的方法是什么呢?拆分是不是更常见,所以每个组都有一个集合?
谢谢你的帮助。
发布于 2018-12-28 20:55:57
对于包含没有索引的排序操作的查询,服务器必须在返回任何结果之前加载内存中的所有文档以执行排序。
因此,首先,确保对要排序结果的任何字段使用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,您应该可以接受您当前的方法。否则,您可能需要考虑进行一些手动分区。
https://stackoverflow.com/questions/53958574
复制相似问题