我正在阅读nodejs驱动程序的mongo文档,尤其是这个索引部分https://www.mongodb.com/docs/drivers/node/current/fundamentals/indexes/#geospatial-索引,看起来他们提到的所有索引都是针对可排序/可搜索数据的。所以我想问我是否需要以下用例的索引:
我有这个用户文档结构
{
email: string,
version: number,
otherData: ...
}
据我所知,我可以通过_id
查询每个用户,并且它已经应用了默认的唯一索引?我也想通过电子邮件查询用户,所以我创建了以下唯一索引
collection.createIndex({ email: 1 }, { unique: true })
我的理解正确吗?通过创建这个索引,我保证thaa:
- 电子邮件总是唯一的
- 我的查询(如
collection.findOne({email: 'my@email.com'})
(已优化
接下来,我想对用户文档执行更新操作,但只对特定版本执行,所以:
collection.updateOne({email: '...', version: 2}, update)
为了优化此查询,我需要创建什么索引?我现在使用的是电子邮件和版本,我应该以某种方式为此研究复合索引吗?
-
是的,唯一约束发生在db层,因此根据定义,这将是唯一的,值得一提的是,这可能会影响插入/更新性能,因为必须在每个实例上执行此检查-根据我的经验,您只会开始在更大范围内感受到这种开销(单个集合中有数亿个文档+每分钟数千次插入(。
-
是的。没有其他方法可以进一步优化这一点。
为了优化此查询,我需要创建什么索引?我现在使用的是电子邮件和版本,我应该以某种方式为此研究复合索引吗?
如果要创建一个复合索引,语法如下:
collection.createIndex({ email: 1, version: 1 }, { unique: true })
我只想说,根据定义,(第一个(email
索引确保了唯一性,因此您添加到查询和索引中的任何额外过滤都不会真正影响任何事情,因为DB中始终只有1封电子邮件。基本上为什么要麻烦添加一个";版本";字段?如果你需要它来过滤,那很好,但你不需要改变现有的索引。