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

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

Linda Hamilton
Linda Hamilton原創
2024-10-22 08:52:02962瀏覽

How Can I Achieve Case-Insensitive Sorting in Cloud Firestore?

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

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'

Unicode 的大小寫折疊

建議使用大小寫折疊來支援 Unicode,如下所示它處理複雜的字元規範化和不區分大小寫的排序。以下JavaScript 程式碼片段提供如何實現大小寫折疊的範例:

<code class="javascript">caseFoldNormalize = function (s){
  return s.normalize('NFKC').toLowerCase().toUpperCase().toLowerCase()
};</code>

範例程式碼

此程式碼片段示範如何建立具有不區分大小寫欄位的Firestore 文件:

<code class="javascript">var raw_document = {
  name: "Los Angeles",
  state: "CA",
  country: "USA",
  structure: 'Waſſerſchloß',
  message: 'quıt quit' // Notice the different i's
};

var field_options = {
  name: 'case_fold',
  country: 'case_fold',
  structure: 'case_fold',
  message: 'case_fold'
}

var firestore_document = caseFoldDoc(raw_document, field_options);

db.collection("cities").doc("LA").set(firestore_document).then(function() {
  console.log("Document successfully written!");
}).catch(function(error) {
  console.error("Error writing document: ", error);
});</code>

這將產生一個同時包含區分大小寫和不區分大小寫欄位的文件:

<code class="javascript">{ 
 "name": "Los Angeles", 
 "state": "CA", 
 "country": "USA", 
 "structure": "Waſſerſchloß", 
 "message": "quıt quit", 
 "name_casefold": "los angeles", 
 "country_casefold": "usa", 
 "structure_casefold": "wasserschloss", 
 "message_casefold": "quit quit"
}</code>

請記住,雖然此技術提供了Firestore 中不區分大小寫排序的解決方案,但它每次文件更新都需要額外的儲存空間並產生處理成本。與任何解決方案一樣,請考慮權衡並選擇最適合您的應用程式要求的方法。

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

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