我正在与不同的组构建聊天应用程序。因此,我在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)
我的第一个尝试是首先进行极限操作,但是后来我不能依赖顺序,所以这的常用方式是什么? 进行拆分是否更常见,以便每个组都有一个集合?
感谢您的帮助。
答案 0 :(得分:2)
对于包含不带索引的排序操作的查询,服务器 必须将所有文档加载到内存中才能执行排序 返回任何结果。
因此,首先,请确保将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,您可以使用当前的方法。否则,您可能需要考虑进行一些手动分区。