①唯一索引

唯一索引的目的是为了让数据库的某个字段的值唯一,为了确保数据的都是合法的,但是唯一索引在插入数据时会对数据进行检查,一旦重复会抛出异常,效率会比较低,唯一索引只是保证数据库数据唯一的最后一种手段,而不是最佳方式,更不是唯一方式,为了保证效率最好采用别的解决方案来保证数据的唯一合法性,尽量减少数据库的压力。

②唯一索引
> db.foo.ensureIndex({"username": 1}, {"unique": true})
{
        "createdCollectionAutomatically" : true,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.foo.insert({"username": "mengday", "email": "mengday@163.com", "age": 26})
WriteResult({ "nInserted" : 1 })
// username 重复会报错
> db.foo.insert({"username": "mengday", "email": "mengday2@163.com"})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.foo index: username_1 dup key: { : \"mengday\" }"
        }
})
 
// 第一次 插入不包含索引键的文档,插入成功,不包含索引键系统会默认为索引键的值为null
> db.foo.insert({"email": "mengday3@163.com"})
WriteResult({ "nInserted" : 1 })
 
// 第二次插入不包含唯一索引的键,插入失败,因为不包含键,键的值就null,第一次已经有一个值为null, 再插入null,就是重复
> db.foo.insert({"email": "mengday4@163.com"})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.foo index: username_1 dup key: { : null }"
        }
})
 
// 对多个字段创建唯一索引(关系数据库中的联合主键)
db.user.ensureIndex({"username": 1, "nickname": 1}, {"unique": true})
>
③稀疏索引
稀疏索引:对不存在的键就不进行索引,也就是该文档上没有建立索引,索引条目中也不包含 索引键为null的索引条目,所以再次插入不包含索引键的文档不会报错,直接插入。注意:稀疏索引不光和唯一索引配合使用,也可以单独使用
 
> db.foo.drop()
true
> db.foo.ensureIndex({"username": 1}, {"unique": true, "sparse": true})
{
        "createdCollectionAutomatically" : true,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.foo.insert({"email": "mengday1@163.com"})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({"email": "mengday2@163.com"})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({"username": "mengday3", "email": "mengday3@163.com"})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({"username": "mengday3", "email": "mengday3@163.com"})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.foo index: username_1 dup key: { : \"mengday3\" }"
        }
})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

第27章:MongoDB-索引--唯一索引的更多相关文章

  1. mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况

    The locks are normally next-key locks that also block inserts into the "gap" immediately b ...

  2. 一个Web报表项目的性能分析和优化实践(四):MySQL建立索引,唯一索引和组合索引

    先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库,而且这几个项目的表是完全一样的. 数据库表的特点 ...

  3. MongoDB分片,唯一索引与upsert

    前言 分片,唯一索引和upsert,表面上看似没有直接联系的几个东西,到底存在怎样的瓜葛呢? 分片 为了保持水平扩展的有效性,分片功能必须保证各个片之间没有直接关联,不需要与其他分片交互就可以独立做出 ...

  4. MongoDB(课时22 唯一索引)

    3.6.1 唯一索引 唯一索引的主要目的是用在某一个字段上,使该字段的内容不重复. 范例:创建唯一索引 db.students.ensureIndex({"name" : 1}, ...

  5. MongoDB 学习五:索引

    这章我们介绍MongoDB的索引,用来优化查询. 索引介绍 数据库索引有些类似书的目录. 一个查询如果没有使用索引被称为表扫描,意思是它必须像阅读整本书那样去获取一个查询结果.一般来说,我们应尽量避免 ...

  6. MongoDB学习笔记——索引管理

    索引 索引能够提升查询的效率.没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档. 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式.索引能够存储某种特殊字段或字 ...

  7. TokuMX唯一索引不支持dropDups选项

    TokuMX v1.5.0的唯一索引(unique index)不支持dropDups选项, 如果源数据包含相同目标key的文档,将无法建立唯一索引. 问题场景: 从MongoDB到TokuMX的数据 ...

  8. SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 <第八篇>

    聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Ser ...

  9. 唯一索引 && 主键索引

    唯一索引唯一索引不允许两行具有相同的索引值. 如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存. 当新数据将使表中的键值重复时,数据库也拒绝接受此数据.例如,如果在 ...

随机推荐

  1. python中类变量和成员变量、局部变量总结

    class Member(): num= #类变量,可以直接用类调用,或用实例对象调用 def __init__(self,x,y): self.x=x #实例变量(成员变量),需要它是在类的构造函数 ...

  2. Head First Servlets & JSP 学习笔记 第二章 —— Web应用体系结构

    Servlet没有main()方法,所以Servlet受其他人控制,这个其他人就是容器!而Tomcat就是一种容器. 容器向Servlet提供Http请求和Http响应:容器来调用Servlet的do ...

  3. listView悬浮头部的简单实现

    简而言之   为listView设置onScrollListener  当滑动时 firstVisibleItem>=要悬浮的 item的position时 让悬浮部分显示  否则隐藏 其实就是 ...

  4. javascript 的原型与原型链的理解

    javascript中一切皆对象,但是由于没有Class类的概念,所以就无法很好的表达对象与对象之间的关系了. 比如对象A与对象B之间,它们两个是相对独立的个体,互不干扰,对象A修改自身的属性不会影响 ...

  5. YII2中ActiveDataProvider与GridView的配合使用

    YII2中ActiveDataProvider可以使用yii\db\Query或yii\db\ActiveQuery的对象,方便我们构造复杂的查询筛选语句. 配合强大的GridView,快速的显示我们 ...

  6. npoi设置数据有效性

    npoi设置数据有效性 public void SetDataValidate(ISheet sheet, int firstCol, int lastCol) { CellRangeAddressL ...

  7. js文件,同样的路径,拷贝过来的为什么不能访问

    从解决方案管理器中拖过来的可以直接访问,而从 bundleconfig中拷贝过来后修改的就访问不到. 如下: 引用一: <script src="~/Content/Plugins/j ...

  8. MongoDb进阶实践之九 Mongodb的备份与还原

    一.引言 前几天写了MongoDB数据库的聚合.一说到“聚合”,用过关系型数据库的人都应该知道它是一个什么东西,主要是用于对数据分类汇总和统计.大家都知道,做为DBA还有另一个重要的任务,那就是对数据 ...

  9. dev accordionControl panelcontorl 使用

    对于dev的窗体布局我想更系统的专业的学学,不是评自己以往 的经验去做, 所以我看了dev的demo 里边的例子,封装的很严实,还有他们自己重新做的控件,无法直接使用, 关键的控件也上了锁,可能也是保 ...

  10. Window10系统的安装

    关于系统的安装网上有许多的教程,本文的教程并没有什么特别的.只是将自己在安装过程中遇到的问题记录下来,方便以后观看. 1.下载系统镜像 首先从MSDN上下载windows10镜像.在操作系统Windo ...