在对大型数据集进行排序时,mongodb集合上创建的索引仍然失败

时间:2018-02-05 05:26:12

标签: mongodb

我的查询如下:

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来进行排序工作,寻找帮助正确添加索引

1 个答案:

答案 0 :(得分:2)

索引中字段的顺序很重要。要通过不在索引键模式开头的字段对查询结果进行排序,查询必须在排序键之前的所有前缀键上包含相等条件。 cid 字段不在查询中,也不用于排序,因此您必须将其保留。然后,在等同条件中使用 bid 字段时,首先将 bid 字段放在索引定义中。 start_time 之后用于排序。最后,索引必须如下所示:

{"bid" : 1, "start_time" : 1}

有关详细信息,请参阅the documentation