mongodb 唯一索引 性能_什么是唯一索引

mongodb 唯一索引 性能_什么是唯一索引MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等。同时索引的属性可以具有唯一性,即唯一索引。唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性。缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引。本文主要描述唯一索引的用法。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

MongoDB支持的索引种类很多,诸如单键索引,复合索引,多键索引,TTL索引,文本索引,空间地理索引等。同时索引的属性可以具有唯一性,即唯一索引。唯一索引用于确保索引字段不存储重复的值,即强制索引字段的唯一性。缺省情况下,MongoDB的_id字段在创建集合的时候会自动创建一个唯一索引。本文主要描述唯一索引的用法。

一、创建唯一索引语法

    //语法
    db.collection.createIndex( <key and index type specification>, { unique: true } )

    语法更多描述可参考:http://blog.csdn.net/leshami/article/details/53541978

二、演示创建唯一索引

1、演示环境

    > db.version()
    3.2.10

    演示集合数据,可以参考:http://blog.csdn.net/leshami/article/details/52672310

    > db.persons.find().limit(1).pretty()
    {
            "_id" : ObjectId("5812cbaaa129eed14b46458d"),
            "name" : "robinson.cheng",
            "age" : 25,
            "email" : "robinson.cheng@qq.com",
            "score" : {
                    "c" : 89,
                    "m" : 96,
                    "e" : 87
            },
            "country" : "USA",
            "books" : [
                    "JS",
                    "C++",
                    "EXTJS",
                    "MONGODB"
            ]
    }

2、单个键(列)上的唯一索引

    > db.persons.createIndex({name:1},{unique:true})
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 1,
            "numIndexesAfter" : 2,
            "ok" : 1
    }
    > db.persons.getIndexes()
    [
            {
                    "v" : 1,
                    "unique" : true,    //此处表示这个索引为唯一索引
                    "key" : {
                            "name" : 1
                    },
                    "name" : "name_1",
                    "ns" : "test.persons"
            }
    ]

3、基于复合键(列)的唯一索引

    > db.persons.createIndex({name:1,email:1},{unique:true})
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 2,
            "numIndexesAfter" : 3,
            "ok" : 1
    }
    > db.persons.getIndexes()
    [
             {
                    "v" : 1,
                    "unique" : true,  //此处表示这个索引为唯一索引
                    "key" : {
                            "name" : 1,  //这个是索引对应的键,包括name和email
                            "email" : 1
                    },
                    "name" : "name_1_email_1",
                    "ns" : "test.persons"
            }
    ]

4、创建唯一索引的一些限制

    对于那些已经存在非唯一的列,在其上面创建唯一索引将失败
    不能够基于一个哈希索引指定唯一性

    Unique Constraint Across Separate Documents

    唯一的约束适用于集合中的单独的文档。也就是说,唯一的索引可以防止不同的文档具有相同的索引键值,
    但索引并不能阻止在基于数组或者内嵌文档创建的唯一索引上具有多个相同的值。
    在一个具有重复值的单个文档的情况下,重复的值仅插入到该索引一次。

    假定存在以下集合
    > db.collection.insert( { a: [ { b: 4 }, { b: 4 } ] } )
    WriteResult({ "nInserted" : 1 })

    > db.collection.find()
    { "_id" : ObjectId("58199898ae431a4615ec75ac"), "a" : [ { "b" : 4 }, { "b" : 4 } ] }

    在集合上a.b上创建一个唯一索引
    > db.collection.createIndex( { "a.b": 1 }, { unique: true } )
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 1,
            "numIndexesAfter" : 2,
            "ok" : 1
    }

    如果集合中没有文档上存在a.b为5的值,则唯一索引允许以下文档插入集合
    > db.collection.insert( { a: [ { b: 5 }, { b: 5 } ] } )
    WriteResult({ "nInserted" : 1 })
    > db.collection.insert( { a: [ { b: 5 }, { b: 5 } ] } )   //再次插入则提示错误
    WriteResult({
            "nInserted" : 0,
            "writeError" : {
                    "code" : 11000,
                    "errmsg" : "E11000 duplicate key error collection: test.collection index: a.b_1 dup key: { : 5.0 }"
            }
    })

    > db.collection.insert( { a: [ { b: 5 }] } )  //再次插入则提示错误,即使是该文档仅有一个相同的数组元素
    WriteResult({
            "nInserted" : 0,
            "writeError" : {
                    "code" : 11000,
                    "errmsg" : "E11000 duplicate key error collection: test.collection index: a.b_1 dup key: { : 5.0 }"
            }
    })
    > db.collection.insert( { a: [ { b: 6 }] } )
    WriteResult({ "nInserted" : 1 })

    Unique Index and Missing Field

    如果一个文档在一个唯一索引中没有索引字段的值,则该索引将为该文档存储一个空值。
    由于唯一约束限制,MongoDB只会允许一个文档缺少索引字段。
    对多于一个以上的文档没有索引字段的值或缺少索引字段,索引构建将失败,提示重复键错误。

    假定存在如下集合
    > db.mycol.insert({x:1})
    WriteResult({ "nInserted" : 1 })

    //为集合添加唯一索引
    > db.mycol.createIndex( { "x": 1 }, { unique: true } )
    {
            "createdCollectionAutomatically" : false,
            "numIndexesBefore" : 1,
            "numIndexesAfter" : 2,
            "ok" : 1
    }

    //再次插入x:1,如下,我们收到了错误提示
    > db.mycol.insert({x:1})
    WriteResult({
            "nInserted" : 0,
            "writeError" : {
                    "code" : 11000,
                    "errmsg" : "E11000 duplicate key error collection: test.mycol index: x_1 dup key: { : 1.0 }"
            }
    })

    //向集合插入文档x:2,y:2
    > db.mycol.insert({x:2,y:2})
    WriteResult({ "nInserted" : 1 })

    //插入一个缺少x键的新文档,如下,可以成功插入
    > db.mycol.insert({y:2})
    WriteResult({ "nInserted" : 1 })

    //再次插入一个缺少x键的新文档,提示重复
    > db.mycol.insert({z:1})
    WriteResult({
            "nInserted" : 0,
            "writeError" : {
                    "code" : 11000,
                    "errmsg" : "E11000 duplicate key error collection: test.mycol index: x_1 dup key: { : null }"
            }
    })

三、更多参考

MongoDB 单键(列)索引
MongoDB 复合索引
MongoDB 多键索引
MongoDB执行计划获取(db.collection.explain())

DBA牛鹏社(SQL/NOSQL/LINUX)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191469.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 看完很清醒,我相信这是一个同龄人写的。。加油。。被扇醒的感觉

    你学习一般,考上了现在的这个学校,成绩不算好,拿不到校奖国奖,自习不规律上课不常听,考试全靠突击,同学帮一把也能考到七八十分。你家境一般,父母都是普通员工,在这个城市一个月生活费一千二,没事下下馆子,一个月添一件衣服,想买台相机要等几个月,经常要咬咬牙才能买双自己喜欢的鞋。你特长一般,不会吉他不会钢琴不会跳舞不会画画,想学摄影却不会PS,想上台演出却没信心,学校晚会比赛的时候,你经

    2022年3月8日
    33
  • pythoncharm注释快捷键_jsp注释快捷键

    pythoncharm注释快捷键_jsp注释快捷键常用的快捷键1.设置(ctrl+alt+s)2.快速创建文件(alt+insert)3.自动格式化(ctrl+alt+l)4.快速注释代码(ctrl+/)5.快速取消注释代码(ctrl+/)6.复制一行代码(ctrl+d)7.撤销操作(ctrl+z)常用的注释方式1.单行注释使用#2.多行注释使用三引号“””“””…

    2022年8月28日
    3
  • window批处理bat命令详解_cmd批处理命令

    window批处理bat命令详解_cmd批处理命令常见问题:1.如果你自己编写的.bat文件,双击打开,出现闪退 2.批处理.bat文件中输出中文乱码 解决方法在文章末尾!前言批处理文件(batchfile)包含一系列DOS命令,通常用于自动执行重复性任务。用户只需双击批处理文件便可执行任务,而无需重复输入相同指令。编写批处理文件非常简单,但难点在于确保一切按顺序执行。编写严谨的批处理文件可以极大程度地节省时间,在应对重复性工…

    2022年8月22日
    10
  • rabbitmq高可用集群搭建_mongodb高可用架构

    rabbitmq高可用集群搭建_mongodb高可用架构RabbitMQ高可用集群搭建1集群简介1.1集群架构​ 当单台RabbitMQ服务器的处理消息的能力达到瓶颈时,此时可以通过RabbitMQ集群来进行扩展,从而达到提升吞吐量的目的。RabbitMQ集群是一个或多个节点的逻辑分组,集群中的每个节点都是对等的,每个节点共享所有的用户,虚拟主机,队列,交换器,绑定关系,运行时参数和其他分布式状态等信息。一个高可用,负载均衡的RabbitMQ集群架构应类似下图:这里对上面的集群架构做一下解释说明:​ 首先一个基本的Rabbi

    2025年10月21日
    4
  • svn安装及使用(身体功能手册)

        下载`TortoiseSVN官网下载址:https://www.visualsvn.com/visualsvn/download/tortoisesvn/下载完成后是这样的 安装TortoiseSVN:此处的安装地址建议不动,当然你也可以选择你要安装的地址安装完成后在桌面点击右键查看如果有标记的两个文件说明已经安装成功.如果感觉英语看到有点困难的可以安装汉化TortoiseSVN:下载语…

    2022年4月15日
    71
  • ReverseFind(‘\\‘)函数

    ReverseFind(‘\\‘)函数此函数表示从右开始寻找最后一个“\\”的,并返回从左开始数的索引地址。与之相对的是Find(””)函数,表示从左开始寻找第一个“\\”,并返回从左开始数的索引地址。

    2022年6月26日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号