2012-10-29 157 views
0

我有一個將日期範圍嵌入文檔的項目。嵌套查詢日期範圍

類似以下內容:

{ "availabilities" : [ 
    { "start_date" : ISODate("2012-06-28T00:00:00Z"), "end_date" : ISODate("2012-10-03T00:00:00Z") },  
    { "start_date" : ISODate("2012-10-08T00:00:00Z"), "end_date" : ISODate("2012-10-28T00:00:00Z") }] 
} 

我需要做的是找到所有在一定時間內 可我用這樣一個查詢的文件是什麼:

db.faces.find({"availabilities" : {"$elemMatch" : {"$and" : [{"start_date" : {"$lte" : ISODate('2012-10-01 00:00:00 UTC')}}, {"end_date" : {"$gte": ISODate('2012-10-07 00:00:00 UTC')}}]}}}) 

但它不會使用我的索引:

{ 
    "v" : 1, 
    "key" : { 
    "availabilities.start_date" : 1, 
    "availabilities.end_date" : 1 
    }, 
    "ns" : "faces_development.faces", 
    "name" : "availabilities.start_date_1_availabilities.end_date_1" 
} 

當我對查詢進行解釋時,t他爲indexBounds輸出很奇怪,我不明白。

{ 
    "cursor" : "BtreeCursor availabilities.start_date_1_availabilities.end_date_1", 
    "isMultiKey" : true, 
    "n" : 71725, 
    "nscannedObjects" : 143019, 
    "nscanned" : 143019, 
    "nscannedObjectsAllPlans" : 143221, 
    "nscannedAllPlans" : 143221, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 2, 
    "nChunkSkips" : 0, 
    "millis" : 1608, 
    "indexBounds" : { 
    "availabilities.start_date" : [ 
     [ 
      true, 
      ISODate("2012-10-01T00:00:00Z") 
     ] 
     ], 
    "availabilities.end_date" : [ 
     [ 
     { 
      "$minElement" : 1 
     }, 
     { 
      "$maxElement" : 1 
     } 
     ] 
    ] 
    }, 
    "server" : "foobar.local:27017" 
} 

當前版本的MongoDB:MongoDB的外殼版本:2.2.0

我該怎麼辦呢使用索引?

試圖找到MongoDB上的相關問題和錯誤,但沒有取得很大的成功。

+0

我不知道這個indexBounds是什麼意思,但是「cursor:'BtreeCursor'」表示它正在使用索引。 – hlidotbe

+0

嗯你的索引界限之一有「真」值?你可能會發現你的數據不乾淨。確實是使用索引,但由於某種原因,索引造成了比它應該掃描的更寬的掃描,因爲它正在掃描143019,但它只返回71725.它可能是在elemmatch中使用$ gt和$ lt,不潔的數據 – Sammaye

回答