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)
上一篇 2026年1月31日 下午5:15
下一篇 2026年1月31日 下午5:43


相关推荐

  • Java 8 Stream Collectors groupingBy 示例

    Java 8 Stream Collectors groupingBy 示例展示如何使用Java8Stream Collectors进行分组,计数,总和和排序List分组,计数和排序1.1分组List并显示其总数。Java8Example1.javapackagecom.mkyong.java8;importjava.util.Arrays;importjava.util.List;importjava.util.Map;

    2022年8月20日
    8
  • linux 下一个 osw先从操作系统和标准脚本主动发起

    linux 下一个 osw先从操作系统和标准脚本主动发起

    2022年1月3日
    46
  • JMM详解_jmm是啥

    JMM详解_jmm是啥如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题,netty,springboot,springcloud等系列文章,一系列干货随时送达,超神之路从此展开,BTAJ不再是梦想!概念​ Java内存模型(JavaMemoryModel,JMM)JMM主要是为了规定了线程和内存之间的一些关系。根据JMM的设计,系统存在一个主内存(MainMemory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Worki

    2025年9月12日
    7
  • ROS机器人里程计模型

    ROS机器人里程计模型3.5移动机器人系统模型相信大家的机器人平台STM32端底层控制和机器人urdf建模都已经顺利完成了,在正式开始ros端编写机器人启动功能包之前,我们还不得不学习一些必要的理论知识。别担心数学不好,这里基本都是高中数学。下面我们开始,Areyouready?没准备好也开始了。3.5.1常用坐标系系统模型在移动机器人技术研究中,最为常用的坐标系统是笛卡尔坐标系统。而在SLAM算法研究中,有如下几个比较常见的笛卡尔坐标系统,它们分别为机器人坐标系XRYROR、传感器坐标系XSYSOS

    2022年6月30日
    31
  • iscsiadm命令基本用法[通俗易懂]

    iscsiadm命令基本用法[通俗易懂]发现目标iscsiadm-mdiscovery-tsendtargets-p192.168.1.1:3260-mdiscovery指定模式为discovery-p192.168.1.1:3260指定目标ip和端口登入节点iscsiadm-mnode–Tiqn.1997-05.com.test:raid-p192.168.1.1:3260-l系统启动时自动登入iscsiadm-mnode–Tiqn.1997-05.com.test:raid-p192.16

    2022年8月23日
    10
  • 利用STM32F103精确控制步进电机「建议收藏」

    利用STM32F103精确控制步进电机「建议收藏」**利用STM32F103控制步进电机精确角度转动**欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Markdown编辑器,可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,…

    2022年6月1日
    40

发表回复

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

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