1. 程式人生 > >MongoDB 唯一索引

MongoDB 唯一索引

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" : "
[email protected]
", "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 }"
            }
    })

三、更多參考

DBA牛鵬社(SQL/NOSQL/LINUX)

相關推薦

MongoDB唯一索引(unique:true)導致的問題

最近在使用Vue + MongoDB + express 寫一個專案。 之前使用mongoose 定義Schema的時候 先定義一個欄位為unique(唯一索引),類似於: const bookSch

MongoDB 唯一索引

MongoDB支援的索引種類很多,諸如單鍵索引,複合索引,多鍵索引,TTL索引,文字索引,空間地理索引等。同時索引的屬性可以具有唯一性,即唯一索引。唯一索引用於確保索引欄位不儲存重複的值,即強制索引欄位的唯一性。預設情況下,MongoDB的_id欄位在建立

4.非關系型數據庫(Nosql)之mongodb:普通索引唯一索引

log 索引 xpl sys watermark lang mon style gravity  一:普通索引 1創建一個新的數據庫 > use toto; switched to db toto

Python程式建立MongoDB資料庫集合的唯一索引

可以使用ensure_index或者create_index方法,兩種方法語法相同。 首先,連線資料庫中的目標集合: col = MongoClient(the_client).get_database(the_db).get_collection(the_col) 然後,建立唯一

MongoDB效能篇 -建立索引,組合索引唯一索引,刪除索引和explain執行計劃

一、索引 MongoDB 提供了多樣性的索引支援,索引資訊被儲存在system.indexes 中,且預設總是為_id建立索引,它的索引使用基本和MySQL 等關係型資料庫一樣。其實可以這樣說說,索引是凌駕於資料儲存系統之上的另一層系統,所以各種結構迥異的儲存都有相同或

mongodb 建立唯一索引,去除重複資料

如果建立唯一索引的時候,有資料重複,則會報錯,所以可以通過以下方法間接解決: 1.將資料匯出json格式 ./mongoexport -d liuniu -c tWechatMessage -o tWechatMessage.json  -d 資料庫名 -c 集合名 -

MongoDB 建立基礎索引、組合索引唯一索引以及優化

一、索引 MongoDB 提供了多樣性的索引支援,索引資訊被儲存在system.indexes 中,且預設總是為_id建立索引,它的索引使用基本和MySQL 等關係型資料庫一樣。其實可以這樣說說,索引是凌駕於資料儲存系統之上的另一層系統,所以各種結構迥異的儲存

MongoDB 創建基礎索引、組合索引唯一索引以及優化

表示 mil cap 監控工具 actor lai slow time _id 一、索引 MongoDB 提供了多樣性的索引支持,索引信息被保存在system.indexes 中,且默認總是為_id創建索引,它的索引使用基本和MySQL 等關系型數據庫一樣。其實可以這樣說說

mongodb(2) -索引創建

lsp log find html 對象 uniq code style unique 在shell中查看集合中已經存在的索引,你可以運行: db.things.getIndexes() 要查看數據庫中所有的索引,可以運行: db.system.indexes.

MongoDB索引

什麽 語法 dia 毫秒 cti 需要 大數據量 mce ges   一、索引的概念   相信大家對索引都不陌生,數據庫的索引類似書籍的目錄索引一樣,有了索引,看書的時候就不用翻遍整本書,就可以根據目錄頁數直接跳轉到目標內容,提高閱讀和查詢效率。數據庫的索引也是如此,它的作

唯一索引小結

聚集索引 唯一索引 禁止 有一個 唯一約束 nod 可能 應該 空值 唯一索引(UNIQUE KEY) 不允許具有索引值相同的行,從而禁止重復的索引或鍵值。 嚴格意義上講,應該叫做唯一約束。 在唯一約束上,和主鍵一樣(以MyISAM引擎為代表)。 其他不同的方面: 1.唯一

oracle 唯一索引唯一約束,主鍵之間的聯系

檢查 特性 dad cda 聯系 其它 分享圖片 ges oracl 主鍵(primary key)是表中的一個或多個字段,它的值用於唯一地標識表中的某一條記錄,在兩個表的關系中,主鍵用來在一個表中引用來自於另一個表中的特定記錄,,主鍵時一種唯一關鍵字,表定義的一部分。一個

MongoDB 覆蓋索引查詢

無需 出現 min 通過 提取數據 mongo 條件 官方 dex 官方的MongoDB的文檔中說明,覆蓋查詢是以下的查詢: 所有的查詢字段是索引的一部分 所有的查詢返回字段在同一個索引中 由於所有出現在查詢中的字段是索引的一部分, MongoDB 無需在整個數據文檔中

mysql唯一索引問題

情況 提示 mysq image ima 今天 sql name inf 今天去面試的時候,面試官有問了一個MYSQL唯一索引的問題,假設有個唯一索引 user_uni(name,age),刪除了列age,會出現什麽情況? 面試的時候他說列可以刪除掉,但查詢的時候會有問題

SQL有三個類型的索引唯一索引 不能有重復,但聚集索引,非聚集索引可以有重復

返回 自動添加 post 設置 span 唯一索引 tca lock 所有 重要: (1) SQL如果創建時候,不指定類型那麽默認是非聚集索引 (2) 聚集索引和非聚集索引都可以有重復記錄,唯一索引不能有重復記錄。 (3) 主鍵 默認是加了唯一約束的聚集索引,但是也可

MySQL-5-唯一索引-外鍵的變種

唯一索引 去重 spa loading 分享圖片 圖片 SQ 博客 image 唯一索引 唯一索引 聯合唯一索引 外鍵的變種 博客園 FK不能去重,一個用戶只有一個博客園 MySQL-5-唯一索引-外鍵的變種

MySQL給字段唯一索引的三種方法

const color varchar clas 約束 weight mysql ODB arch 建表時添加 DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `stu_id` int(11)

mysql 預設分頁查詢,主鍵索引,和聯合唯一索引的坑

最近遇到一個比較坑的問題,列表分頁查詢的時候,查詢全部沒問題,根據條件查詢就會出現亂序,多頁之間有重複資料的問題。   因為用的通用mapper元件,於是打出來sql看了下,發現分頁查詢sql沒有order  by,結果查詢出來的順序是亂的,因為查詢條件之一是聯合唯一

mysql索引、主鍵、唯一索引、聯合索引的區別(索引的建立原則和注意事項)

索引對資料庫效能的影響? 本質:縮小查詢範圍。大大減少需要掃描的資料量。大大提高查詢的速度,降低寫的速度,佔用磁碟。將隨機I/O變成順序I/O 特大的表怎麼解決查詢問題? 分割槽。 主鍵索引和唯一索引的區別? 一個表只能有一個主鍵索引,但可以有多個唯一索引, 主鍵索引是唯一索

普通索引唯一索引的區別、性能差異,以及其他索引簡介

整數 排列 唯一索引 同名 關聯 超過 結果 其它 加載 唯一索引和普通索引使用的結構都是B-tree,執行時間復雜度都是O(log n)。 1、普通索引  普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。因此,應該只為那些最經常出現在查