稀疏索引和部分索引

稀疏索引:

這些對於可選但也應該是唯一的欄位特別有用。

{ "_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 選項和稀疏的選項不能同時被指定。