Je me demande s'il est possible d'obtenir plusieurs documents par une liste d'identifiants en un seul aller-retour (appel réseau) vers la base de données Firestore.
Si vous souhaitez appeler cette méthode avec un tableau de références de documents généré dynamiquement, vous pouvez procéder comme suit : firestore.getAll(...arrayOfReferences).then()
5 votes
Vous semblez supposer que les allers-retours causent des problèmes de performance dans votre application. Je ne le penserais pas. Firebase a l'habitude de fonctionner correctement dans de tels cas, puisqu'il canaliser les demandes . Je n'ai pas vérifié comment Firestore se comporte dans ce scénario, mais j'aimerais bien avoir la preuve d'un problème de performance avant de supposer qu'il existe.
4 votes
Disons que j'ai besoin de documents
a
,b
,c
pour faire quelque chose. Je demande les trois en parallèle dans des demandes séparées.a
prend 100 ms,b
prend 150ms, etc
prend 3000ms. Par conséquent, je dois attendre 3000ms pour effectuer la tâche. Cela va êtremax
d'entre eux. Cela va être plus risqué lorsque le nombre de documents à récupérer est important. Selon l'état du réseau, je pense que cela peut devenir un problème.1 votes
Ne les enverrait-on pas tous en une seule fois ?
SELECT * FROM docs WHERE id IN (a,b,c)
prennent le même temps pourtant ? Je ne vois pas la différence, puisque la connexion est établie une seule fois et que le reste est acheminé en pipeline par-dessus. Le temps (après l'établissement initial de la connexion) est le temps de chargement de tous les documents + 1 aller-retour, identique pour les deux approches. Si le comportement est différent pour vous, pouvez-vous partager un échantillon (comme dans ma question liée) ?0 votes
Je crois que je vous ai perdu. Quand vous dites que c'est pipeliné, voulez-vous dire que Firestore regroupe et envoie automatiquement les requêtes à son serveur en un seul aller-retour vers la base de données ?
0 votes
Pour information, ce que j'entends par un aller-retour est un appel réseau à la base de données depuis le client. Je demande si les requêtes multiples sont automatiquement regroupées en un seul aller-retour par Firestore, ou si les requêtes multiples sont exécutées en plusieurs allers-retours en parallèle.
0 votes
Avez-vous lu la réponse que j'ai mise en lien dans mon premier commentaire ? Elle explique le concept de pipelining mieux que je ne peux le faire dans ces commentaires.
1 votes
Oui, j'ai lu votre réponse, mais je ne sais toujours pas s'il y aura plusieurs appels réseau ou un seul. Il semble qu'il y aura
n
des appels réseau en parallèle pourn
plutôt qu'un seul appel réseau qui faitn
des requêtes en une seule fois.0 votes
Ils ne sont pas vraiment en parallèle, mais en pipeline. Mais le résultat est pratiquement le même. Encore une fois : Je n'ai pas encore vérifié que c'est bien ce que fait Firestore, mais je ferais quelques mesures avant de supposer que cela prenne
N*(read_time+transfer_time+latency)
. S'ils sont pipelinés, c'est plus proche deN*(transfer_time)+read_time+latency
.0 votes
Je crois que cette question a été traitée par @FrankvanPuffelen (qui travaille chez Firebase) dans une autre question : stackoverflow.com/questions/35931526/
0 votes
Pour tous ceux qui essaient de comprendre comment exécuter plusieurs requêtes en boucle car le SDK mobile (Flutter pour iOS/Android) ne propose pas la fonction getAll(), consultez cet article : stackoverflow.com/a/42176121/9248277 (explique comment traiter une liste de Futures en parallèle)