Cloud Firestore の OrderBy クエリは大文字と小文字を区別してデータを並べ替えるため、予想されるデータと一致しない結果が発生します。実際のソート動作。たとえば、「AAA」および「aaa」として保存されているデータは、「AAA」、「BBB」、「aaa」、「bbb」のようにソートされますが、望ましい順序は「AAA」、「aaa」、「BBB」、
Cloud Firestore には、大文字と小文字を区別しない並べ替え用の組み込みフラグが提供されていません。唯一の効果的な解決策は、文書内に機密フィールドを 2 回保存することです。最初のフィールド myData には、元のデータがそのまま保存されます。 2 番目のフィールド 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 文字を扱う場合、大文字と小文字の区別はより複雑になります。大文字と小文字を区別しない並べ替えは人間の言語によって異なる場合があるため、一貫した結果を保証するには追加の処理が必要になります。 1 つのアプローチは、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 中国語 Web サイトの他の関連記事を参照してください。