2015-02-07 2 views
0

Так что этот индексиндекс не используется

db.contact.ensureIndex(
{ 
    'first_name':1, 
    'last_name':1, 
    'company_name':1, 
    'title':1, 
    'email':1, 
    'phone_number':1, 
    'state':1, 
    'list_id':1 
}); 

если я запускаю этот запрос с $or индекс не используется

db.contact.find(
       { 
        $or: [ 
          {'first_name':/sales/i}, 
          {'last_name':/sales/i}, 
          {'company_name':/sales/i}, 
          {'title':/sales/i}, 
          {'email':/sales/i}, 
          {'phone_number':/sales/i}, 
          {'state':/sales/i} 
        ] 
       }).explain(); 

выход:

{ 
    "cursor" : "BasicCursor", //Btree Index not being used !? 
    "isMultiKey" : false, 
    "n" : 0, 
    "nscannedObjects" : 0, 
    "nscanned" : 0, 
    "nscannedObjectsAllPlans" : 0, 
    "nscannedAllPlans" : 0, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "server" : "", 
    "filterSet" : false 
} 
+0

Создание индекса для каждого элемента, по-видимому, является решением в соответствии с: http://stackoverflow.com/a/6875645/2805783 – donquixote

ответ

1

С учетом следующих документов:

(1){first_name: 'sales', last_name: 'something', company_name: 'something'}, 
(2){first_name: 'something', last_name: 'sales', company_name: 'something'}, 
(3){first_name: 'something', last_name: 'something', company_name: 'sales'} 

Вы хотите получить их все в своем Итак, если mongodb использовали {first_name: 1, last_name: 1, company_name: 1}), то он автоматически исключал бы номер записи два и три с первого имени в этих два случая различны. Поэтому, чтобы получить оставшиеся документы, вам все равно придется сканировать все документы.

PS

кажется, что вы вы запрашиваете запущенный против пустой коллекции?

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