12. MongoDB的文档操作之索引的类型

1.MongoDB的索引分为哪些类型?

  • 单字段索引
  • 复合索引
  • 多key索引
  • 文本索引

每一种索引都有不同的使用场景

2.单字段索引

  • 所谓的单字段索引是指在索引中只包含一个键。
  • 查询时,可加速该字段的各种查询请求
  • 常见的索引形式,MongoDB默认创建_id索引也是这种类型
  • 我们可以使用createIndex({索引键:排序规则})函数来创建单字段索引
  • 语法格式:db.collection_name.createIndex({索引键名:排序规则})

实例:为dev集合中的title键创建单字段索引

db.dev.createIndex({
     title:1},{
     background:true})

12. MongoDB的文档操作之索引的类型_第1张图片

3.交叉索引

  • 所谓的交叉索引就是为一个集合的多个字段分别建立索引,本质是2个索引
  • 在查询的时候通过多个字段作为条件查询,这种情况又称为交叉索引
  • 在查询文档的时候,在查询条件中包含一个交叉索引键或者再一次查询中使用多个交叉索引键作为查询条件都会触发交叉索引

实例:在dev集合中的size键创建交叉索引,我认为本质就是多个单字段索引合在一起,这里需要注意与复合索引的区别

db.dev.createIndex({
     siez:1},{
     background:true})
  • 因为前面的title已经有了索引,那么size再加上一个索引,就构成了交叉索引
    12. MongoDB的文档操作之索引的类型_第2张图片
  • 查看结果

12. MongoDB的文档操作之索引的类型_第3张图片

  • 如何触发交叉索引呢?
db.dev.find({
     title:"aaa",size:111})      # 同时查询title和size

4.复合索引

  • 复合索引是单字段索引的升级版
  • 针对多个字段联合创建索引,先按第一个字段排序,第一个字段相同的文档按第二个字段排序,依次类推
  • 语法格式:db.collection_name.createIndex({索引键名:排序规则,索引键名:排序规则,.....})
  • 复合索引能满足到的查询场景比单字段索引更加丰富,不光能满足多个字段组合起来的查询,也能满足所有能匹配复合索引前缀的查询

实例:

  1. 先删除dev中的交叉索引
db.dev.dropIndexes()  # 删除所有索引

12. MongoDB的文档操作之索引的类型_第4张图片
2. 创建title与size的复合索引

db.dev.createIndex({
     title:1,size:1},{
     background:true})

12. MongoDB的文档操作之索引的类型_第5张图片
3. 查看索引:只有一个索引,他们两个合在一起了,这是与交叉索引的本质区别
12. MongoDB的文档操作之索引的类型_第6张图片

  • 使用注意事项?

打个比方 我有AB两个索引,有A可以触发索引 有AB也可以触发索引,但是只有B是不会触发索引的

5.多key索引

  • 当索引的字段为数组时,创建出的索引称为多key索引,多key索引会为数组的每个元素建立一条索引
  • 语法格式为:db.collection_name.createIndex({数组键名:排序规则})
  • 如果给的不是数组类型的,就变成了单字段索引
  • 实例:为dev集合中的tags键创建多key索引

编写测试数据:

  1. 在dev集合中插入title为dev,并且有一个数组
db.dev.insert({
     title:"dev",tags:["java","python","linux"]})

在这里插入图片描述
2. 查看 dev集合的所有数据

db.dev.find()

12. MongoDB的文档操作之索引的类型_第7张图片
2. 插入多key索引,1指的是升序

db.dev.createIndex({
     tags:1})

12. MongoDB的文档操作之索引的类型_第8张图片
3. 查看索引:

db.dev.getIndexes()

12. MongoDB的文档操作之索引的类型_第9张图片

6.唯一索引

  • MongoDB除了支持不同类型的索引,还能对索引定制一些特殊的属性
  • 唯一索引会保证对应的键不会出现相同的值,比如_id索引就是唯一索引
  • 语法格式:db.collection_name.createIndex({索引键名:排序规则},{unique:true})
  • 如果唯一索引所在字段有重复数据写入时,会抛出异常

实例:

  1. 删除dev集合中的索引,为dev集合中的title键建立唯一索引
db.dev.dropIndexes()

12. MongoDB的文档操作之索引的类型_第10张图片

  1. 创建唯一索引:为dev集合的title键创建唯一索引
db.dev.createIndex({
     title:1},{
     unique:true})

12. MongoDB的文档操作之索引的类型_第11张图片

插入失败,,抛出异常,因为我的title键中有对应的value一样的

  1. 查看数据
db.dev.find()

12. MongoDB的文档操作之索引的类型_第12张图片
4. 确实有一样的,于是先删除所有数据,在编写测试数据

db.dev.deleteMany({
     })

在这里插入图片描述
5. 插入测试数据

db.dev.insert({
     title:"dev1",size:100})
db.dev.insert({
     title:"dev2",size:200})
db.dev.insert({
     title:"dev3",size:300})
db.dev.insert({
     title:"dev4",size:400})
db.dev.insert({
     title:"dev5",size:500})

12. MongoDB的文档操作之索引的类型_第13张图片
6. 再次创建唯一索引

db.dev.createIndex({
     title:1},{
     unique:true})  # 创建title的唯一索引

12. MongoDB的文档操作之索引的类型_第14张图片
7. 创建成功

7.部分索引

  • 部分索引只针对符合某些特定条件的文档建立的索引
  • MongoDB部分索引只为那些在一个集合中,满足特定的筛选条件的文档创建索引
  • 由于部分索引是集合文档的一个子集,因此部分索引具有较低的存储要求,并降低了索引的创建和维护的性能成本
  • 部分索引通过指定过滤条件来创建,可以在MongoDB支持的所有索引类型中使用部分索引
  • 简单点来说:部分索引就是带有过滤条件的索引,即索引只存在于某些特定的文档上
  • 语法格式:db.collection_name.createIndex({索引键名:排序规则},{partialFilterExpression:{键名:{匹配条件:条件值}}})
  • 实例:为dev集合中的size键创建部分索引,条件是大于300
db.dev.createIndex({
     size:1},{
     partialFilterExpression:{
     size:{
     $gt:300}}})

12. MongoDB的文档操作之索引的类型_第15张图片
注意:部分索引只为集合中那些满足指定的筛选条件的文档创建索引,如果你指定的partialFilterExpression是唯一约束、那么唯一约束只适用于满足筛选条件的文档,具有唯一约束的部分索引不会阻止不符合唯一约束且不符合过滤条件的文档的插入

打个比方

  • 现在有部分索引和唯一索引2个一起使用
  • 唯一约束对只对满足了部分索引的数据生效,满足了部分索引的数据,是不允许有重复的
  • 不满足部分索引的数据,是可以重复的

你可能感兴趣的:(MongoDB)