2013-03-18 45 views
0

這是使用mongodb 2.0.4。我們曾想過升級,但只想看看我們是否可以在不這樣做的情況下解決這個問題,因爲我們的設置升級並不容易。創建日期範圍(和其他字段)的覆蓋索引

我有很多更新的查詢在「查找」部分看起來是這樣的:

timestamp: 
{ 
    $gte: ISODate('xxxxx'), 
    $lt: ISODate('xxxxx') 
}, 
id: "string" 
processed: false 

它基本上是搜索記錄的特定日期範圍爲特定的ID內,並從錯誤處理,以真正的更新(這是一個「工人」過程)。

我試着創建一個包含所有3個字段(以及_id)的索引,但explain()仍然返回indexOnly: false。奇怪的是它也返回此爲indexBounds:

"indexBounds" : { 
    "processed" : [ 
     [ 
      false, 
      false 
     ] 
    ] 
} 

有人可以給我一個提示,如何解決這個問題,從而正確的MongoDB使用索引(覆蓋索引)或日期範圍是根本不可能的?

+0

您嘗試創建哪些索引,並將涵蓋的查詢應用於完整的光標,而不僅僅是查找條件,也就是說,您的返回文檔還必須只是索引字段。 – Sammaye 2013-03-18 09:43:27

+0

Sammaye:我知道返回文檔的事情,但在這種情況下,它是一個更新,其唯一更新是設置「processed:false」,因此應該被覆蓋。試圖創建一個包含3個字段(時間戳,ID,處理)以及_id的索引,但它沒有顯示爲覆蓋。 – 2013-03-18 13:54:44

+0

沒有更新將被覆蓋,這是不可能的,一個被覆蓋的查詢只能存在於一個查找中。如果這就是你的意思,$ set可以在文檔中進行原子操作? – Sammaye 2013-03-18 13:57:40

回答

0

最重要的是不只是具有三個字段的索引,但什麼爲了領域都在。

我建議這個article,以獲取有關如何複合索引使用更多的細節。

需要記住的重要一點是,測試平等的字段必須位於測試範圍的字段之前(特別是因爲您的版本是舊的,沒有進行某些優化更高版本)。

+0

我開始越來越多地認爲,我們正在拼命地忽略一些非明顯的,沒有記錄的內部優化,按照字段的順序以及它們如何處理索引,只是簡單地在後面幾個版本。我讀了一篇與你相關的文章的類似文章,這真是令人大開眼界。 – 2013-03-21 05:58:11

+0

我非常肯定你需要注意的所有優化都有記錄:) – 2013-03-21 06:06:31