我的查询如下:
db.chats.find({ bid: 'someID' }).sort({start_time: 1}).limit(10).skip(82560).pretty()
我按照此顺序对字段进行了聊天收集索引
{
"cid" : 1,
"bid" : 1,
"start_time" : 1
}
我正在尝试执行排序,但是当我编写查询并检查explain()的结果时,我仍然获得winsPlan
{
"stage":"SKIP",
"skipAmount":82560,
"inputStage":{
"stage":"SORT",
"sortPattern":{
"start_time":1
},
"limitAmount":82570,
"inputStage":{
"stage":"SORT_KEY_GENERATOR",
"inputStage":{
"stage":"COLLSCAN",
"filter":{
"ID":{
"$eq":"someID"
}
},
"direction":"forward"
}
}
}
}
由于我为该系列创建了索引,因此我期待在获胜计划中没有排序阶段。 没有索引将导致以下错误
MongoError: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM [duplicate]
但是我设法通过将ram上的大小分配从32mb增加到64mb来进行排序工作,寻找帮助正确添加索引
答案 0 :(得分:2)
索引中字段的顺序很重要。要通过不在索引键模式开头的字段对查询结果进行排序,查询必须在排序键之前的所有前缀键上包含相等条件。 cid 字段不在查询中,也不用于排序,因此您必须将其保留。然后,在等同条件中使用 bid 字段时,首先将 bid 字段放在索引定义中。 start_time 之后用于排序。最后,索引必须如下所示:
{"bid" : 1, "start_time" : 1}
有关详细信息,请参阅the documentation。