mongo讀書筆記——索引二
索引型別
唯一索引
唯一索引可以確保集合的每一個文件的指定建都有唯一值。例如:如果想保證不同文件的username鍵擁有不同的值,建立一個唯一索引就好了。
db.users.getIndexes() // 檢視所有索引
> db.users.dropIndex("username_1")//刪除之前建立的索引 { "nIndexesWas" : 3, "ok" : 1 }
db.users,createIndex({"username":1},{"unique":true})//建立唯一索引
如果集合中你要建立唯一索引的鍵的已經存在重複的值,那麼執行上面的命令時就會報錯
> db.users.createIndex({"username":1},{"unique":true}) { "ok" : 0, "errmsg" : "E11000 duplicate key error collection: test.users index: username_1 dup key: { : \"bob\" }", "code" : 11000, "codeName" : "DuplicateKey" }
為了測試我們把重複的刪除再繼續
> db.users.remove({"username":"bob"}) WriteResult({ "nRemoved" : 4 }) > db.users.createIndex({"username":1},{"unique":true}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 } > db.users.insert({"username":"bob"}) WriteResult({ "nInserted" : 1 }) > db.users.insert({"username":"bob"}) WriteResult({ "nInserted" : 0, "writeError" : { "code" : 11000, "errmsg" : "E11000 duplicate key error collection: test.users index: username_1 dup key: { : \"bob\" }" } }) 在username上建立唯一索引後,當我們再插入相當的值時,此時就會報錯。另外,mongo自動生成的_id就會自動建立唯一索引,唯一不同的是這個索引不能被刪除。注:如果一個文件沒有對應的鍵,索引會將其作為null儲存,所以如果對某個鍵建立了唯一索引,但插入了多個缺少該索引鍵的文件,會由於集合已經存在一個該索引鍵的值為奴冷冷的文件而導致插入失敗。有些情況下,一個值可能無法被索引,索引儲桶的大小是有限制的,如果某個索引條目超出了它的限制,那麼這個條目就不會包含在索引裡。每條索引的key不得超過1024個位元組,如果index key的長度超過此值,將會導致write操作失敗。
超出8KB大小的鍵不會受到唯一索引的約束,即可以插入多個同樣的8KB長的字串。
複合唯一索引
也可以建立複合的唯一索引。插入時單個鍵的值可以相同,但所有鍵的組合值必須是唯一的。GirdFS是mongo中儲存大檔案
的標準方式,其中就用到了複合唯一索引。
稀疏索引
前面講過唯一索引會把null看做值,所以無法將多個缺少唯一索引中的鍵的文件插入到集合中。這時我們希望唯一索引只對包含相應鍵的文件生效,如果有一個可能存在也可能不存在的欄位,但是當它存在時,它必須是唯一的,這時就可以將unique與sparse選項組合在一起使用。mongo中的稀疏索引與關係資料庫中的稀疏索引是完全不同的概念,基本上來說,mongo中的稀疏索引只是不需要將每個文件都作為索引條目。
db.createIndex({"email":1}, {"unique":true,"sparse":true})
稀疏索引不必是唯一的,只要去掉unique選項,就可以建立一個非唯一的稀疏索引。