2014-06-06 75 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