Mongodb 也有collation 與 如何使用

張哥說技術發表於2023-02-17

傳統資料庫中collation的使用在MYSQL 和 PG 已經總結了,在MONGODB 中是否有collation的問題,以及Mongodb中的一些資料型別的問題的說一說。

在MONGODB 中也存在collation的問題,在MONGODB 的string 文字型別的都存在這個問題。針對於MONGODB的 collection ,view, index等都涉及特定操作針對collation的操作。因為如果我們不進行這個操作,MONGODB 對於這些資料的操作將採用普通的二進位制字串來對比。

那麼我們從建立一個collection 說起,怎麼建立一個具有collation 的collection。

db.createCollection("en_test",{collation:{ "locale": "en_US", strength : 3,caseFirst: "upper"}})

Mongodb 也有collation 與 如何使用

上面的列子中,我們建立了一個 en_test 的collection, 我們的collation選擇的是 en_US ,排序規則,其中比較的方式的深度,下探到第三個等級,其中包含字母的大小寫比較,字母變體,變音符號等,最後是指定在比對中對於字母大小寫的判斷,誰先誰後。

db.en_test.insert({"text":"aaAABBbb"});

db.en_test.insert({"text":"ccAABBbb"});

db.en_test.insert({"text":"CCAABBbb"});
db.en_test.insert({"text":"aaTTBBbb"});
db.en_test.insert({"text":"SSAABBbb"});
db.en_test.insert({"text":"PPAABBbb"});
db.en_test.insert({"text":"aaAANNbb"});
db.en_test.insert({"text":"AAAANNbb"});
db.en_test.insert({"text":"AAAABBbb"});

下面我們先感性,在理性,的方式先輸入一串資料,然後我們進行比對

Mongodb 也有collation 與 如何使用

我們可以看到,在使用了collation的collection中我們的字元進行了指定方式的排序方面的大小比對。

那麼如果我們如果針對這個字元,不進行相關的處理,結果會是怎麼樣?下圖給出了結果,在沒有任何collation設定的情況下,MONGODB 對於資料的處理,並未根據字元的特性來進行大小寫的排序操作。

Mongodb 也有collation 與 如何使用

到了這裡,我們繼續我們上面的命令的問題.

在MONGODB 中可以進行調整的collation的引數在建立collation的時候就有以下相關的引數


{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}


1  locale :locale  在collation 的使用中是一個核心的引數,這個引數是針對整個collection 進行的設定,這裡有的collation有小的選擇項,所以撰寫的方法需要根據你的collation的情況來定。 參見下圖如 Chinese 中zh 包含了4種小的選項。

撰寫的方式為 { "locale" : "zh@collation=unihan" }

Mongodb 也有collation 與 如何使用


2  strength 

這個引數是整體mongodb collation不可缺失的部分,其中分為5個部分,一般我們至少選擇3作為一個基礎,因為 1 和 2 兩個部分不能滿足字元的大小寫和比較的基本場景。一般的情況下,我們選擇 3 作為基本的選擇,這也是我們預設應該選擇的級別,選擇這個級別下,大小寫和字元的重音等的比較都可以進行比較。如果是日文的一些比對,則可以選擇 4 作為一個選項。

3  caselevel 這個引數在選擇了 strength 為 3後,可以不在出現

4  caseFirst  這個引數有3個值進行選擇,upper ,lower 這個引數是針對 upper 和 lower ,如果選擇 upper 則大寫字母則在比較中 UPPER 會比 LOWER 在排序上靠前,如果選擇lower 則小寫比大寫在排序中靠前。

5  numericOrdering 這個是決定文字元合的數值到底是以數值的方式比較還是以數值的方式比較,如選擇 true 則說明按照數字的方式比較, 如果是false 則是按照 false 來比較。

另外還有其他的一些選擇,這裡由於沒有一些如,丹麥,瑞典,等國的知識,以及語言和重音符號的知識,所以,這些選項暫時無法得知相關的使用用途。

下面我們舉一個例子,在一個字串中,我們需要使用英文的方式對大小寫進行比較,大寫大於小寫,同時我們需要對數字使用數字的方式進行數值的比對

db.createCollection("text_compare",{collation:{ "locale": "en_US", "strength" : 3,"caseFirst": "upper", "numericOrdering": true }})

db.text_compare.find().sort({text:1})

Mongodb 也有collation 與 如何使用

在我們插入資料後進行了排序後,我們發現整體的排序和我們預想的是一樣的數字雖然是以字元的方式進行輸入的,但排序中是以數值的方式進行排序的。

說完這些,實際上我們還有一個問題就是索引的問題,MONGODB 的索引,上面的操作都是輸入了資料而已,但是如果是資料量大的情況下,我們需要索引的加持來處理問題,那麼如何建立一個帶有collation屬性的索引的問題就擺到檯面上來了。

db.text_compare.createIndex({text: 1},{collation:{locale: 'en_US',strength: 3}})

Mongodb 也有collation 與 如何使用

Mongodb 也有collation 與 如何使用

截止目前我們簡單的說了說MONGODB 中的COLLATION 的COLLECTION的建立和索引以及一些特性的問題,希望能讓大家在使用MONGODB 的同時,對於一些更多的細節有更深的瞭解。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2935736/,如需轉載,請註明出處,否則將追究法律責任。

相關文章