官术网_书友最值得收藏!

4.5 唯一性約束

在現(xiàn)實場景中,唯一性是很常見的一種索引約束需求,重復(fù)的數(shù)據(jù)記錄會帶來許多處理上的麻煩,比如訂單的編號、用戶的登錄名等。通過建立唯一性索引,可以保證集合中文檔的指定字段擁有唯一值。

在創(chuàng)建索引時,通過指定unique=true選項可以將其聲明為唯一性索引,代碼如下:

此后,如果嘗試寫入兩個擁有相同標(biāo)題的book文檔,則將會得到如下錯誤提示:

對于指定字段已經(jīng)存在重復(fù)記錄的集合,如果嘗試創(chuàng)建唯一性約束的索引,則會提示如下錯誤:

1.復(fù)合索引的唯一性

除了單字段索引,還可以為復(fù)合索引使用唯一性約束。如果只是希望分類下的書籍標(biāo)題保持唯一性,那么可以建立復(fù)合式的唯一性索引,代碼如下:

2.嵌套文檔的唯一性

唯一性約束同樣可以用于嵌套文檔的某個字段,這和普通索引沒有什么區(qū)別,比如:

但如果希望將整個嵌套文檔作為唯一性的保證,那么在使用時可能會造成困擾,比如:

嵌套文檔的唯一性約束是嚴(yán)格按照寫入順序進(jìn)行比較的,如下代碼所示,盡管寫入的文檔內(nèi)容是一樣的,但由于字段的順序不一致,MongoDB仍然認(rèn)為這是不同的文檔。為了避免產(chǎn)生困擾,建議盡量少用這種做法。

3.數(shù)組的唯一性

如果對數(shù)組索引(multikey index)使用唯一性約束,那么可以保證所有的文檔之間不會存在重疊的數(shù)組元素,代碼如下:

但是,數(shù)組索引上的唯一性約束并無法保證同一個文檔中包含重復(fù)的元素,如下面的語句是可以寫入成功的:

注意,如果數(shù)組中的元素是嵌套的文檔,那么同樣會遇到字段次序的問題。

4.使用約束

● 唯一性索引對于文檔中缺失的字段,會使用null值代替,因此不允許存在多個文檔缺失索引字段的情況。

● 對于分片的集合,唯一性約束必須匹配分片規(guī)則。換句話說,為了保證全局的唯一性,分片鍵必須作為唯一性索引的前綴字段。

主站蜘蛛池模板: 城固县| 商丘市| 黄山市| 泗阳县| 桓台县| 宜州市| 大石桥市| 田林县| 昌黎县| 涡阳县| 修文县| 耿马| 怀远县| 马关县| 方正县| 平邑县| 元阳县| 浑源县| 邵阳县| 凤冈县| 江津市| 香格里拉县| 政和县| 永新县| 敖汉旗| 法库县| 和静县| 元阳县| 南澳县| 北碚区| 寿宁县| 馆陶县| 三亚市| 政和县| 岗巴县| 崇阳县| 托克逊县| 龙川县| 衡阳市| 伊吾县| 营口市|