首頁  >  文章  >  web前端  >  如何在 Cloud Firestore 中啟用不區分大小寫的排序?

如何在 Cloud Firestore 中啟用不區分大小寫的排序?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-22 08:57:02779瀏覽

How to Enable Case Insensitive Sorting in Cloud Firestore?

使用查詢在Cloud Firestore 中進行不區分大小寫的排序

問題描述

Cloud Firestore 的OrderBy 查詢區分大小寫對資料進行排序,導致預期與結果之間存在差異實際的排序行為。例如,儲存為“AAA”和“aaa”的資料被排序為“AAA”、“BBB”、“aaa”和“bbb”,而所需的順序是“AAA”、“aaa”、“BBB”,和“bbb”。

解決不區分大小寫的排序

Cloud Firestore 不提供用於不區分大小寫排序的內建標誌。唯一有效的解決方案是在文件中將敏感欄位儲存兩次。第一個欄位 myData 會按原樣儲存原始資料。第二個欄位 myData_insensitive 儲存不區分大小寫的資料版本。

DocA:
-> myData = 'AAA'
-> myData_insensitive = 'AAA'

DocB:
-> myData = 'aaa'
-> myData_insensitive = 'AAA'

DocC:
-> myData = 'BBB'
-> myData_insensitive = 'BBB'

DocD:
-> myData = 'bbb'
-> myData_insensitive = 'BBB'

查詢並顯示資料

現在可以在 myData_insensitive 上執行查詢,確保不區分大小寫的排序。但是,原始資料是透過從 myData 中提取值來顯示的。

Unicode 和國際化

處理 Unicode 字元時,大小寫折疊變得更加複雜。不區分大小寫的排序可能因人類語言而異,需要額外的處理以確保結果一致。一種方法是使用caseFoldNormalize() 標準化資料並將結果儲存在單獨的欄位中:

<code class="javascript">caseFoldNormalize = function (s){
  return s.normalize('NFKC').toLowerCase().toUpperCase().toLowerCase()
};
caseFoldDoc = function(doc, field_options) {
  // Case fold desired document fields
  if (field_options != null) {
    for (var field in field_options) {
      if (field_options.hasOwnProperty(field)) {
        switch(field_options[field]) {
          case 'case_fold':
            if (doc.hasOwnProperty(field) &amp;&amp; Object.prototype.toString.call(doc[field]) === &quot;[object String]&quot;) {
              doc[field.concat(&quot;_insensitive&quot;)] = caseFoldNormalize(doc[field])
            }
            break;
        }
      }
    }
  }
  return doc;
}</code>

儘管這是一種有效的解決方法,但值得注意的是,這種方法涉及額外的儲存和處理開銷,在生產應用程式中實現它時應考慮這一點。

以上是如何在 Cloud Firestore 中啟用不區分大小寫的排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn