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)

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 有意思的批处理

    有意思的批处理

  • 75道面试逻辑智力测试题内附详细答案「建议收藏」

    75道面试逻辑智力测试题内附详细答案「建议收藏」【1】假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。答案:由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有1升水,因此6只能向5倒4升水,然后将6剩余的2升,倒入空的5里面,再灌满6向5里倒3升,剩余3升。【2】周雯的妈妈是豫林水泥厂的化验员。一天,周雯来到化验室做作业。做完后想出去玩…

  • 云计算具有什么平台_如何搭建自己的云计算平台?「建议收藏」

    如果你的服务器很多,或者你的钱多了烧,可以考虑搭建自己的云计算平台。下面是一些开源的云计算框架和工具1.Enomalism(https://www.enomaly.com/)云计算平台。Enomalism是一个开放源代码项目,它提供了一个功能类似于EC2的云计算框架。Enomalism基于Linux,同时支持Xen和KernelVirtualMachine(KVM)。En…

  • shiro安全框架_漏洞利用及攻击框架

    shiro安全框架_漏洞利用及攻击框架一、Shiro漏洞原理ApacheShiro框架提供了记住我的功能(RemeberMe),用户登录成功后会生成经过加密并编码的cookie。cookie的key为RemeberMe,cookie的值是经过对相关信息进行序列化,然后使用aes加密,最后在使用base64编码处理形成的在服务端接收cookie值时,按以下步骤解析:检索RemeberMecookie的值Base64解码使用ACE解密(加密密钥硬编码)进行反序列化操作(未作过滤处理)在调用反序列化的时候未进行任何过滤,导致

  • python tkinter库 密码实时显示_python tkinter库实现气泡屏保和锁屏

    python tkinter库 密码实时显示_python tkinter库实现气泡屏保和锁屏本文实例为大家分享了pythontkinter库实现气泡屏保和锁屏的具体代码,供大家参考,具体内容如下显示效果如下:代码:importrandomimporttkinterimportthreadingfromctypesimport*classRandomBall(object):”””定义关于球的类”””def__init__(self,canvas,screen_wid…

发表回复

您的电子邮箱地址不会被公开。

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