数据库中,会有好几种索引,比如唯一索引,普通字段上的索引等
1. 唯一索引
和mysql中唯一索引用法类似, 用来保证集合中每一个document的指定键都有唯一值,比如 Id字段,
同样,如果某一个字段设置了唯一索引,那么只可以插入相同的值一次,如果有一个null,则不允许再次插入该键为null的记录 比如一个网站注册用户,可以用手机号或者邮箱,然后手机号和邮箱需要做唯一索引,此时就会存在一个问题,
db.user.ensureIndex({mobile:1,email:1},{unique:true})
//如果a是用手机号注册的,没填邮箱信息,那么邮箱保存的是null
//此时b也想有手机号注册,但是无法注册,因为它的邮箱也是null
//这就是唯一索引的缺点,可以结合稀疏索引使用
但是,在mongoDB中, 有个特殊情况, 如果某个键的索引条目超过了 索引储桶的大小限制,那么这个条目就不会包含在索引中,换句话说,他就不会受到索引约束, 也就是超过8KB大小的键不会受到唯一索引的约束
- 复合唯一索引
唯一索引,可以建立在单个字段,也可以建立在多个字段,比如{name:1,age:1} //在这个复合键上建立唯一索引
- 在已有的集合创建唯一索引,可能失败
已经存在的集合,有可能存在重复值,这时候创建唯一索引,有可能创建失败,可以考虑先删除重复值
2.稀疏索引
-
注意
mongodb中稀疏索引和关系型数据库中的系数索引完全不同的概念, mongodb中稀疏索引只是不需要将每个document作为索引条目
稀疏索引就是 : 仅包含具有索引字段的文档的条目 ,比如下边的数据中{ name : 'abc',age : 14 }, { name : 'def',age : 16 }, { name : 'abc',age : 14 ,class:'一班'}, { name : 'def',age : 16 ,class:'二班'}
如果对class建立稀疏索引,那么查询的时候,只会在有class属性的document中进行检索
-
使用方式
使用sparse可以创建稀疏索引db.user.ensureIndex({name:1},{"sparse":true})
可以利用稀疏索引 + 唯一索引 实现 那种,”只有存在才可以唯一的唯一索引“
db.user.ensureIndex({name:1},{"unique": true,"sparse":true})
3. mongo中索引默认命名
- 一般规则
所以都会有一个名称,用于唯一表示这个索引,也可以用来服务器端删除或者操作,默认命名规则是keyName1_dir1_keyname2_dir2 // keyname是键的名字,dir是升序还是降序,比如 name_1_age_-1