2015-02-07 65 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 2015-02-08 01:26:19

回答

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})索引,它將自動排除自動記錄第二個和第三個,因爲first_name在這些兩種情況是不同的。因此,爲了獲得剩餘的文件,您必須掃描所有文件。

PS

看來你是runnig你查詢空集合嗎?