2014-06-06 74 views
0

最初存在的字段我有一個集合,其中在最初我們有一個審查文件索引不MongoDB中

{ 
_id:ObjectId(...), 
comment:"hi, test comment", 
crBy:ObjectId(...) 
} 

的結構如下現在,當那麼管理員評論這一點,狀態字段被添加到它更新文檔到

{ 
    _id:ObjectId(...), 
    comment:"hi, test comment", 
    crBy:ObjectId(...), 
    status:"approved" 
    } 

對於一些原因,我不能有狀態最初,它必須被放置在當管理員進行審覈,並配備了一個價值批准或不批准

所以,現在查詢獲取用戶創建的所有評論,並獲得批准將會像.... db.reviews.find({「crBy」:ObjectId(...),「status」:「approved」})

我優化通過創建既包括crBy和狀態字段

我的問題的索引讀取是:提前

1.Am i creating the index in the right way? 

2. I have read that indexes should contain fields that don't change. So in my case status field gets inserted afterwards. How does it 
impact my performance? 

3. Considering my case, what do you suggest to be the best possible way to optimize reads in such a scenario where a field comes later 
on? 

感謝

回答

0

沒有什麼從創建阻止你一個關鍵的索引不存在。鑑於你的查詢,你的索引應該反映它

db.collection.ensureIndex({crBy: 1, status: 1}, {background: 1}) 

我已經在後臺添加選項。這將確保在重建此索引時,它不會阻止其他操作。它仍然會影響狀態更新的性能。建議對不改變的東西建立索引的唯一原因是因爲寫入時重建索引的開銷,在這種情況下,由於此索引,您將獲得讀取速度,所以它是值得的。

+0

謝謝。所以每次添加或更新新記錄時,完整的索引都將被重建?那麼隨着記錄的增加,這意味着隨着時間的推移,更新/插入將開始花費時間。並防止我們應該有背景模式設置?我的解釋是否正確? – hellojava

+0

而且我也讀過已經投入生產的db,使用背景是有意義的。我們仍處於開發階段,我們將確保從開始時的索引,即從第一個記錄到來的時間。所以在這種情況下,背景是否仍然可以提高我的表現,或者它的工作方式與forground相同? – hellojava

+0

整個索引沒有得到重建,但你看到性能下降(我看到從15k插入/秒下降到7k),所以,你會沒事的。我還沒有針對第二個問題進行測試,但是隨着文檔的閱讀,它仍然有幫助。 – kwolfe