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에서 값을 추출하여 표시됩니다.
유니코드 문자를 다룰 때 대소문자 구분이 더 복잡해집니다. 대소문자를 구분하지 않는 정렬은 언어에 따라 다를 수 있으므로 일관된 결과를 보장하려면 추가 처리가 필요합니다. 한 가지 접근 방식은 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!