- MongoDB進(jìn)階與實戰(zhàn):微服務(wù)整合、性能優(yōu)化、架構(gòu)管理
- 唐卓章
- 697字
- 2021-05-19 17:44:47
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ī)則。換句話說,為了保證全局的唯一性,分片鍵必須作為唯一性索引的前綴字段。
- 軟件項目估算
- Computer Vision for the Web
- Learning Flask Framework
- Getting Started with Python Data Analysis
- jQuery開發(fā)基礎(chǔ)教程
- 深入淺出Serverless:技術(shù)原理與應(yīng)用實踐
- PhoneGap:Beginner's Guide(Third Edition)
- SQL Server 2016數(shù)據(jù)庫應(yīng)用與開發(fā)
- Bootstrap 4 Cookbook
- Learning Unreal Engine Android Game Development
- SQL Server實用教程(SQL Server 2008版)
- Hadoop 2.X HDFS源碼剖析
- Mockito Essentials
- Python機器學(xué)習(xí)開發(fā)實戰(zhàn)
- C語言開發(fā)寶典