索引不包含';在MongoDB中最初不存在

索引不包含';在MongoDB中最初不存在,mongodb,indexing,database,Mongodb,Indexing,Database,我有一个集合,最初我们有一个审查文件的以下结构 { _id:ObjectId(...), comment:"hi, test comment", crBy:ObjectId(...) } 现在,当管理员检查这个时,会向其中添加一个状态字段,将文档更新为 { _id:ObjectId(...), comment:"hi, test comment", crBy:ObjectId(...), status:"approved" } 由于某些原因,我最

我有一个集合,最初我们有一个审查文件的以下结构

{
_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和status字段的索引来优化读取

我的问题是:

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?

提前感谢

没有什么可以阻止您在不存在的键上创建索引。给定您的查询,您的索引应该镜像它

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

我添加了背景选项。这将确保重建此索引时不会阻止其他操作。它仍然会对状态更新的性能产生影响。建议对不会更改的内容建立索引的唯一原因是,在写入时重建索引的开销,在这种情况下,您将因为该索引而获得读取速度,因此这是值得的。

谢谢。所以每次添加或更新新记录时,都会重建完整的索引?那么这是否意味着随着记录的增加,更新/插入将开始花费时间。为了防止这种情况,我们应该设置背景模式?我的解释正确吗?我还了解到,对于已经投入生产的db,使用后台是有意义的。我们仍处于开发阶段,我们将从一开始就确保索引,即从第一条记录出现时开始。因此,在这种情况下,后台是否仍然提高了我的性能,或者它的工作方式与forground相同?整个索引不会重建,但您确实看到性能下降(我看到从15k inserts/s下降到7k),因此,您不会有问题。我还没有对你的第二个问题进行测试,但正如文件所述,这仍然会有帮助。