首页  >  文章  >  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