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 字元時,大小寫折疊變得更加複雜。不區分大小寫的排序可能因人類語言而異,需要額外的處理以確保結果一致。一種方法是使用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) && Object.prototype.toString.call(doc[field]) === "[object String]") { doc[field.concat("_insensitive")] = caseFoldNormalize(doc[field]) } break; } } } } return doc; }</code>
儘管這是一種有效的解決方法,但值得注意的是,這種方法涉及額外的儲存和處理開銷,在生產應用程式中實現它時應考慮這一點。
以上是如何在 Cloud Firestore 中啟用不區分大小寫的排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!