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中文网其他相关文章!