web-dev-qa-db-fra.com

Les documents de requête Firestore commencent avec une chaîne

Est-il possible d'interroger une collection firestore pour obtenir tous les documents qui commence par une chaîne spécifique?

J'ai parcouru la documentation mais je ne trouve aucune requête appropriée pour cela.

24
Bishwajyoti Roy

Vous pouvez, mais c'est délicat. Vous devez rechercher des documents supérieurs ou égaux à la chaîne souhaitée et inférieurs à une clé de successeur.

Par exemple, pour rechercher des documents contenant un champ 'foo' regarder avec 'bar' vous demanderiez:

db.collection(c)
    .where('foo', '>=', 'bar')
    .where('foo', '<', 'bas');

Il s'agit en fait d'une technique que nous utilisons dans l'implémentation client pour numériser des collections de documents correspondant à un chemin. Notre calcul de la clé successeur est appelé par un scanner qui recherche toutes les clés commençant par l'ID utilisateur actuel.

44
Gil Gilbert

même réponse que par Gil Gilbert. Juste une amélioration et un exemple de code. utilisez String.fromCharCode et String.charCodeAt

var strSearch = "start with text here";
var strlength = strSearch.length;
var strFrontCode = strSearch.slice(0, strlength-1);
var strEndCode = strSearch.slice(strlength-1, strSearch.length);

var startcode = strSearch;
var endcode= strFrontCode + String.fromCharCode(strEndCode.charCodeAt(0) + 1);

puis filtrez le code comme ci-dessous.

db.collection(c)
.where('foo', '>=', startcode)
.where('foo', '<', endcode);

Fonctionne sur n'importe quelle langue et tout Unicode.

Attention: tous les critères de recherche dans le magasin Firest SENSIBLE.

29
Kyo Kurosagi

Extension des réponses précédentes avec une version plus courte:

  const text = 'start with text here';
  const end = text.replace(/.$/, c => String.fromCharCode(c.charCodeAt(0) + 1));

  query
    .where('stringField', '>=', text)
    .where('stringField', '<', end);

Exemple IRL

async function search(startsWith = '') {
  let query = firestore.collection(COLLECTION.CLIENTS);

  if (startsWith) {
      const end = startsWith.replace(
        /.$/, c => String.fromCharCode(c.charCodeAt(0) + 1),
      );

      query = query
        .where('firstName', '>=', startsWith)
        .where('firstName', '<', end);
  }

  const result = await query
    .orderBy('firstName')
    .get();

  return result;
}
0
kidroca