被MongoDB用Index暴打的後端小菜雞日記-day27- Index Types

鰻魚燒
Sep 27, 2022

--

昨天介紹不少索引好用的特性,除了加快資料搜尋速度以外,還有不同的功能,適合用在不同的情境下,今天要來介紹基於欄位的資料型態不同,而分出不同的索引類型。

Photo by Raphael Schaller on Unsplash

Multikey Index

當建立索引的欄位,資料格式是陣列時,MongoDB會自動建立multikey index。這類型的索引,在建立時會有一些限制。

例如:在Compound Index中,最多只能包含一個索引欄位的資料格式是陣列,這時候會有兩種出錯的可能性。

一種是無法建立索引,當欄位的資料格式都是陣列

另一種是無法寫入資料,會跑出錯誤訊息 MongoError: cannot index parallel arrays [a] [b]

但是這種資料格式,是被允許的,因為每一筆資料只有一個索引欄位的資料格式是陣列。

Text Indexes

顧名思義是針對文字欄位建立的索引,可以針對不同的語言進行設定,根據官方文件的說法,針對不同語言的字根解析、停用詞的忽略會有所不同。

The default language associated with the indexed data determines the rules to parse word roots (i.e. stemming) and ignore stop words.

同時也可以針對不同的欄位,設定搜尋的權重

假設我們現在有專門紀錄部落格的collection,包含文字的欄位有content、about 、keywords這三種,範例資料如下

MongoDB官網上的範例

要建立索引的話,可以使用以下語法

ps. 有支援哪些語言,請參考官方文件

Hashed Indexes

在建立索引時,會將欄位的資料利用hashing function轉換成雜湊值,儲存在索引中,如果使用hashed indexes必須注意一些限制。

  1. 不支援Multikey Index,索引欄位不可以是陣列,否則會發生錯誤
  2. 無法建立Unique Indexes
  3. 盡量不要將含有浮點數的欄位,轉換成hashed indexes,詳情參考

建立方式也很簡單,在要建立索引的欄位後面寫”hashed”即可。

Wildcard Indexes

因為MongoDB支持dynamic schemas,並沒有硬性規定資料格式,如果有欄位的資料格式是會變化,很難預測未來會加入什麼資料,但又想要建立索引加快資料的搜尋速度,可以透過$**建立Wildcard Indexes,支持對未知或任意字段的查詢。

假設有以下資料

而我們針對userMetadata這個欄位建立wildcard indexes

則該索引可以支持以下搜尋條件

--

--

鰻魚燒

剛轉職成後端工程師的小菜雞,分享自己的學習筆記