稀疏索引和部分索引
稀疏索引:
這些對於可選但也應該是唯一的欄位特別有用。
{ "_id" : "john@example.com", "nickname" : "Johnnie" }
{ "_id" : "jane@example.com" }
{ "_id" : "julia@example.com", "nickname" : "Jules"}
{ "_id" : "jack@example.com" }
由於兩個條目沒有指定 nickname
,並且索引將未指定的欄位視為 null,因此索引建立將失敗並且 2 個文件具有 null
,因此:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
會讓你仍然擁有’null’暱稱。
稀疏索引更緊湊,因為它們跳過/忽略未指定該欄位的文件。因此,如果你的集合中只有不到 10%的文件指定了此欄位,則可以建立更小的索引 - 如果要執行以下查詢,可以更好地利用有限的記憶體:
db.scores.find({'nickname': 'Johnnie'})
部分索引:
部分索引表示稀疏索引提供的功能的超集,應該優先於稀疏索引。 ( 3.2 版中新增功能 )
部分索引根據指定的篩選器確定索引條目。
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
如果 rating
大於 5,那麼 cuisine
將被索引。是的,我們也可以根據其他屬性的值指定要索引的屬性。
稀疏和部分索引之間的差異:
稀疏索引僅根據索引欄位的存在選擇要索引的文件,或者對於複合索引,選擇索引欄位的存在。
部分索引根據指定的篩選器確定索引條目。過濾器可以包括索引鍵以外的欄位,並且可以指定除存在性檢查之外的條件。
仍然,部分索引可以實現與稀疏索引相同的行為
例如:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
注意: 無論是 partialFilterExpression 選項和稀疏的選項不能同時被指定。