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".
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'
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.
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) && Object.prototype.toString.call(doc[field]) === "[object String]") { doc[field.concat("_insensitive")] = 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!