Maison >interface Web >js tutoriel >Comment activer le tri insensible à la casse dans Cloud Firestore ?

Comment activer le tri insensible à la casse dans Cloud Firestore ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-22 08:57:02854parcourir

How to Enable Case Insensitive Sorting in Cloud Firestore?

Tri insensible à la casse dans Cloud Firestore à l'aide d'une requête

Description du problème

La requête OrderBy de Cloud Firestore trie les données en fonction de la casse, ce qui entraîne des écarts entre les valeurs attendues et comportement de tri réel. Par exemple, les données stockées sous la forme « AAA » et « aaa » sont triées comme « AAA », « BBB », « aaa » et « bbb », alors que l'ordre souhaité est « AAA », « aaa », « BBB ». et "bbb".

Résoudre le tri insensible à la casse

Cloud Firestore ne fournit pas d'indicateur intégré pour le tri insensible à la casse. La seule solution efficace est de stocker deux fois le champ sensible dans le document. Le premier champ, myData, stocke les données d'origine telles quelles. Le deuxième champ, myData_insensitive, stocke une version des données insensible à la casse.

DocA:
-> myData = 'AAA'
-> myData_insensitive = 'AAA'

DocB:
-> myData = 'aaa'
-> myData_insensitive = 'AAA'

DocC:
-> myData = 'BBB'
-> myData_insensitive = 'BBB'

DocD:
-> myData = 'bbb'
-> myData_insensitive = 'BBB'

Interrogation et affichage des données

Les requêtes peuvent désormais être exécutées sur myData_insensitive, garantissant un tri insensible à la casse. Cependant, les données d'origine sont affichées en extrayant la valeur de myData.

Unicode et internationalisation

La casse devient plus complexe lorsqu'il s'agit de caractères Unicode. Le tri insensible à la casse peut varier selon les langues humaines, nécessitant un traitement supplémentaire pour garantir des résultats cohérents. Une approche consiste à normaliser les données à l'aide de caseFoldNormalize() et à stocker le résultat dans un champ séparé :

<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>

Bien qu'il s'agisse d'une solution de contournement efficace, il est important de noter que cette approche implique une surcharge de stockage et de traitement supplémentaire, ce qui doit être pris en compte lors de sa mise en œuvre dans les applications de production.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn