2013-02-12 5 views
0

Пожалуйста, посмотрите на следующий пример. Мне кажется, что запрос должен быть покрыт индексом {a: 1}, однако explain() дает мне indexOnly: false. Что я делаю неправильно?MongoDB не использует даже самый простой индекс

> db.foo.save({a: 1, b: 2}); 
> db.foo.save({a: 2, b: 3}); 
> db.foo.ensureIndex({a: 1}); 
> db.foo.find({a: 1}).explain(); 
{ 
    "cursor" : "BtreeCursor a_1", 
    "nscanned" : 6, 
    "nscannedObjects" : 6, 
    "n" : 6, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "a" : [ 
      [ 
       1, 
       1 
      ] 
     ] 
    } 
} 
+0

Он использует индекс, как показано курсором '' BtreeCursor'. Есть, по-видимому, шесть документов - есть ли что-то о других, если это случайно вызывает такое поведение? – WiredPrairie

+1

Я думаю, что ваша интерпретация 'indexOnly' отключена, см. Http://docs.mongodb.org/manual/applications/indexes/#indexes-covered-queries –

ответ

1

индекс обозначает только лицензированный запрос (http://docs.mongodb.org/manual/applications/indexes/#indexes-covered-queries), согласно которому запрос и его рода и данные могут быть найдены в пределах одного индекса.

Проблема с запросом:

db.foo.find({a: 1}).explain(); 

ли, что он должен получить полный текст документа, который означает, что он не может найти все данные в пределах индекса. Вместо этого вы можете использовать:

db.foo.find({a: 1}, {_id:0,a:1}).explain(); 

Что будет означать, что вы только проецировать a поле, которое делает всю подгонку запросов в индекс, и так indexOnly быть истинным.

 Смежные вопросы

  • Нет связанных вопросов^_^