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.
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])}`);
* });
*/
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.
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.
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.
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'])
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".