在MongoDB中对一个一开始不存在的字段建立索引

3
我有一个收藏,最初我们拥有以下结构的评论文档。
{
_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?

提前感谢。
1个回答

1

你完全可以在不存在的键上创建索引。根据你的查询,你的索引应该与它相匹配。

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

我已经添加了背景选项。这将确保在重建此索引时,它不会阻止其他操作。它仍然会影响状态更新的性能。唯一建议在某些不变的东西上建立索引的原因是,在写入时重建索引的开销,而在这种情况下,由于此索引,您将获得读取速度,因此值得这样做。

谢谢。所以每次添加或更新新记录,都会重建完整的索引?那么随着记录数量的增加,插入/更新会变得更加耗时,是这个意思吗?为了防止这种情况发生,我们应该设置背景模式,我的解释正确吗? - hellojava
我也看到了对于已经投入生产的数据库,使用后台处理是有意义的。我们的数据库仍处于开发阶段,我们将确保从一开始就创建索引,即从第一条记录开始。在这种情况下,后台是否仍然可以提高我的性能,或者与前台处理方式相同? - hellojava
整个索引不会被重建,但是你会看到性能下降(我看到插入速度从15k/s下降到7k/s),所以你还是可以使用的。我没有对你的第二个问题进行测试,但根据文档所述,它仍然会有帮助。 - kwolfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接