Google Firestore - comment obtenir un document par plusieurs identifiants en un seul aller-retour?

Je me demande s'il est possible d'obtenir plusieurs documents par liste d'identifiants en un aller-retour (appel réseau) au Firestore.

26
demandé sur Renaud Tarnec 2017-10-13 05:18:42

6 réponses

Si vous êtes dans le nœud:

Https://github.com/googleapis/nodejs-firestore/blob/master/src/index.js#L533

/**
* Retrieves multiple documents from Firestore.
*
* @param {...DocumentReference} documents - The document references
* to receive.
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
* contains an array with the resulting document snapshots.
*
* @example
* let documentRef1 = firestore.doc('col/doc1');
* let documentRef2 = firestore.doc('col/doc2');
*
* firestore.getAll(documentRef1, documentRef2).then(docs => {
*   console.log(`First document: ${JSON.stringify(docs[0])}`);
*   console.log(`Second document: ${JSON.stringify(docs[1])}`);
* });
*/
21
répondu Nick Franceschina 2018-01-24 13:27:07

Non, à l'heure actuelle, il n'y a aucun moyen de traiter plusieurs demandes de lecture en utilisant le SDK Cloud Firestore et donc aucun moyen de garantir que vous pouvez lire toutes les données à la fois.

Cependant, comme L'a dit Frank van Puffelen dans les commentaires ci-dessus, cela ne signifie pas que l'extraction de 3 documents sera 3 fois plus lente que l'extraction d'un document. Il est préférable d'effectuer vos propres mesures avant d'arriver à une conclusion ici.

8
répondu Sam Stern 2017-10-16 15:01:27

La meilleure façon de le faire est sûrement d'implémenter la requête réelle de Firestore dans une fonction Cloud? Il n'y aurait alors qu'un seul appel aller-retour du client à Firebase, ce qui semble être ce que vous demandez.

Vous voulez vraiment garder toute votre logique d'accès aux données comme ce côté serveur de toute façon.

En interne, il y aura probablement le même nombre d'appels à Firebase lui-même, mais ils seraient tous à travers les interconnexions ultra-rapides de Google, plutôt que le réseau externe, et combiné avec le pipelining que Frank van Puffelen a expliqué, vous devriez obtenir d'excellentes performances de cette approche.

3
répondu Chris Wilson 2018-03-04 11:07:44

Cela ne semble pas être possible dans Firestore pour le moment. Je ne comprends pas pourquoi la réponse D'Alexander est acceptée, la solution qu'il propose renvoie simplement tous les documents de la collection" utilisateurs".

Selon ce que vous devez faire, vous devriez chercher à dupliquer les données pertinentes que vous devez afficher et ne demander un document complet qu'en cas de besoin.

0
répondu Horea 2017-12-23 09:26:09

Vous pouvez utiliser une fonction comme celle-ci:

function getById (path, id) {
  return firestore.getAll(
    [].concat(ids).map(id => firestore.doc(`${path}/${id}`)
  )
}

Il peut être appelé avec un seul ID:

getById('collection', 'some_id')

Ou un tableau d'Id:

getById('collection', ['some_id', 'some_other_id'])
0
répondu JP de la Torre 2018-05-17 15:13:59

Le mieux que vous pouvez faire est non Utilisez Promise.all comme votre client doit alors attendre .all les lectures avant de continuer.

Itérez les lectures et laissez-les résoudre indépendamment. Du côté client, cela se résume probablement à l'interface utilisateur ayant plusieurs images du chargeur de progression résolues en valeurs indépendamment. Cependant, c'est mieux que de geler l'ensemble du client jusqu'à ce que .all les lectures soient résolues.

Par conséquent, videz immédiatement tous les résultats synchrones dans la vue, puis laissez les résultats asynchrones arrivent à mesure qu'ils se résolvent, individuellement. Cela peut sembler une petite distinction, mais si votre client a une mauvaise connectivité Internet (comme je l'ai actuellement dans ce café), geler toute l'expérience client pendant plusieurs secondes entraînera probablement une expérience "cette application est nulle".

0
répondu Ron Royston 2018-09-17 19:29:02