首页 >web前端 >js教程 >如何在 Cloud Firestore 中启用不区分大小写的排序?

如何在 Cloud Firestore 中启用不区分大小写的排序?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-22 08:57:02855浏览

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