Partage
  • Partager sur Facebook
  • Partager sur Twitter

Accès au données de firestore firebase

Besoin d'aide

    29 janvier 2023 à 12:02:23

    Bonjour, pour accéder au données d'une collection pas de problèmes, mais pour accèder à des données à plusieurs niveaux je n'y arrive pas.

    Voici le résultat :

    Et voici mon code :

    const getUser = async () => {
          const userRef = await firestore().collection("users").doc(userId);
          await userRef.collection("plants").doc('GYHpxAnaQAL2qvlMQKJK').get()
    
          console.log(userRef);
    
        }
        useEffect( () => {
          getUser()

    Et pour finir voici mes collections : 

    Je voudrais récupérer toutes les plantes pour les lister avec leurs nom, mais je n'arrive pas à y accéder.

    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      29 janvier 2023 à 13:16:50

      Bonjour, la réponse suivante est issue d'une conversation avec ChatGPT:

      ce code Javascript qui utilise le service Firestore de Firebase a un comportement inatendu:

      const getUser = async () => {
            const userRef = await firestore().collection("users").doc(userId);
            await userRef.collection("plants").doc('GYHpxAnaQAL2qvlMQKJK').get()
       
            console.log(userRef);
       
          } 

      Ce code semble être une fonction asynchrone qui utilise la méthode firestore de Firebase pour obtenir une référence à un document dans la collection "users".

      La fonction attend également pour obtenir une référence à un document dans la collection "plants", en utilisant le document ID "GYHpxAnaQAL2qvlMQKJK".

      Finalement, la fonction affiche la référence à l'utilisateur dans la console.

      Si le comportement inattendu se produit, il peut être causé par plusieurs facteurs, tels que l'absence de la bibliothèque firebase,

      une erreur de configuration de l'application Firebase ou une erreur de syntaxe dans le code.

      Il peut également être causé par un manque de données dans la base de données Firestore,

      une erreur de requête Firestore, etc.

      Il serait utile de vérifier toutes ces causes potentielles pour résoudre le problème.

      > Je voudrais récupérer toutes les entrée de la collection plants pour les lister avec leurs nom. Fait le.

      Vous pouvez utiliser la méthode get() de Firestore pour récupérer tous les documents dans la collection "plants". Voici un exemple de code qui récupère tous les documents et les affiche dans la console avec leur nom :

      const getPlants = async () => {
        const plantRef = firestore().collection("plants");
        const snapshot = await plantRef.get();
        
        snapshot.forEach(doc => {
          console.log(doc.data().name);
        });
      };
      

      > Si ma collection comporte beaucoup d'entrées est-ce que j'aurais des problèmes de performances ?

      Il est possible d'avoir des problèmes de performance si vous avez beaucoup d'entrées dans la collection.

      Firestore est conçu pour gérer de grandes quantités de données, mais des requêtes sur de grandes collections peuvent nécessiter plus de temps pour terminer et peuvent entraîner des coûts supplémentaires pour l'utilisation de la base de données.

      Pour minimiser les problèmes de performance, il est conseillé de planifier et de structurer les données de manière à éviter les requêtes sur de grandes collections.

      Vous pouvez également utiliser des techniques telles que les index et les requêtes à plage pour affiner les requêtes et améliorer les performances.

      Il est également important de tenir compte de la bande passante et de la consommation de mémoire lors de l'affichage de grandes quantités de données à l'utilisateur.

      > Ajoute un système de pagination au code précédent pour éviter des problème de performances.

      Vous pouvez ajouter un système de pagination en utilisant la méthode limit() de Firestore.

      Voici un exemple de code qui ajoute un système de pagination en récupérant seulement un nombre limité de documents à la fois :

      const getPlantsWithPagination = async (pageSize = 10, pageNumber = 1) => {
        const plantRef = firestore().collection("plants");
        const snapshot = await plantRef.limit(pageSize).offset((pageNumber - 1) * pageSize).get();
        
        snapshot.forEach(doc => {
          console.log(doc.data().name);
        });
      };

      Dans ce code, nous ajoutons deux paramètres optionnels à la fonction, pageSize et pageNumber.

      pageSize représente le nombre maximum de documents à récupérer dans chaque page, et pageNumber représente le numéro de page à récupérer. Nous utilisons la méthode limit() pour limiter le nombre de documents retournés à pageSize,

      et la méthode offset() pour définir le nombre de documents à sauter au début de la requête.

      En utilisant ces méthodes, nous pouvons implémenter une pagination simple pour les données de la collection.

      > j'ai lu sur la documentation que l'API facture une lecture pour chaque document sauter avec la méthode offset et qu'il faut utiliser les indexes pour améliorer cela, est-ce que c'est vrai ?

      Oui, c'est vrai.

      Firestore facture une lecture pour chaque document récupéré dans une requête, y compris les documents sautés avec la méthode offset().

      Utiliser la méthode offset() peut donc entraîner un coût supplémentaire pour l'utilisation de la base de données si vous sautez de nombreux documents.

      Pour minimiser les coûts, il est recommandé d'utiliser des index pour affiner les requêtes et limiter le nombre de documents récupérés.

      Les index permettent de définir une structure de données pour les requêtes qui vous permet de filtrer les données et de récupérer uniquement les documents nécessaires.

      En utilisant les index, vous pouvez minimiser le nombre de lectures nécessaires pour récupérer les données, ce qui peut réduire les coûts et améliorer les performances de la requête.

      > comment j'utilise les index ?

      Pour utiliser les index dans Firestore, vous devez définir les index dans la console Firebase pour votre projet.

      Voici les étapes pour définir un index :

      1. Accédez à la console Firebase pour votre projet.

      2. Cliquez sur la base de données Firestore pour accéder à la console de gestion de la base de données.

      3. Cliquez sur l'onglet "Index" dans la barre de navigation en haut de la page.

      4. Cliquez sur le bouton "Créer un index" pour définir un nouvel index.

      5. Sélectionnez la collection pour laquelle vous souhaitez définir un index.

      6. Sélectionnez les champs pour lesquels vous souhaitez définir un index.

      7. Cliquez sur "Générer" pour créer l'index.

      Une fois que vous avez défini un index, vous pouvez utiliser les champs inclus dans l'index pour affiner les requêtes et récupérer uniquement les données nécessaires. Par exemple, si vous avez défini un index sur un champ de date, vous pouvez effectuer une requête qui filtre les données en fonction de la date, ce qui minimisera le nombre de lectures nécessaires pour récupérer les données et améliorera les performances de la requête.

      > Sur quelle version de l'API te base tu pour générer ce code ?


      Ce code utilise la version 7.x de la bibliothèque cliente de Firestore pour JavaScript.

      C'est la dernière version publique de la bibliothèque cliente au moment de la connaissance de formation de l'IA (2021).

      Il est toujours recommandé de vérifier la documentation Firebase pour la version la plus à jour et de vous assurer d'utiliser la dernière version de la bibliothèque pour bénéficier des dernières fonctionnalités et améliorations de performance.

      -
      Edité par SamuelGaborieau3 29 janvier 2023 à 13:23:57

      • Partager sur Facebook
      • Partager sur Twitter

      suggestion de présentation.

        29 janvier 2023 à 13:32:32

        En vrai si c'est pour utiliser chatGpt donne lui le lien directement :D

        Plutôt que de répondre en ton nom alors que tu n'a fait aucun travail de recherche.

        • Partager sur Facebook
        • Partager sur Twitter
          29 janvier 2023 à 13:45:24

          quenti77 a écrit:

          En vrai si c'est pour utiliser chatGpt donne lui le lien directement :D

          Plutôt que de répondre en ton nom alors que tu n'a fait aucun travail de recherche.


          Alors déjà je trouve que les réponses de ChatGPT sont pertinentes, j'ai pris le temps de les analyser, et je pense avoir les capacité de compréhension pour du Javascript, c'est pour ça que je l'utilise pas pour aller répondre à des questions qui touche a des sujets que je ne connais pas,

          car j'aurais pas les capacité de poser / reformuler les questions pour les rendre plus pertinentes, où de pousser les questions un peut plus loin pour voir d'éventuels problèmes, tel que:

          > j'ai lu sur la documentation que l'API facture une lecture pour chaque document sauter avec la méthode offset et qu'il faut utiliser les indexes pour améliorer cela, est-ce que c'est vrai ?


          Je réponds pas en mon nom j'indique que les réponses proviennent de ChatGPT.

          Je ne ces pas comment on fait pour générer un lien vers un conversation, je pense pas que l'on puisse, car j'ai demandé à ChatGPT:

          > Est-ce que je peux générer un lien vers cette conversation ?

          Et il me répond:

          < Non, il n'y a pas de lien direct vers une conversation spécifique dans ce système de messagerie.

          Cependant, vous pouvez prendre une capture d'écran de la conversation et la conserver pour une référence future.

          Et oui effectivement il pourrait lui même aller poser la question a ChatGPT, comme les 3 / 4 des problèmes sur ce forum (en tous cas pour la partie HTML/CSS Javascript et PHP). 

          • Partager sur Facebook
          • Partager sur Twitter

          suggestion de présentation.

            29 janvier 2023 à 13:55:08

            En vrai, comment te croire alors que justement tu as utilisé le site ChatGPT pour répondre. Si tu connaissais la réponse et le sujet tu aurai répondu directement et pas utilisé ChatGPT pour le faire à ta place.

            Donc dire que tu peux analyser ce qu'il écrit est faux. Si tu avais utiliser ChatGPT pour comprendre et ensuite dit une réponse de ton cru, avec tes mots là on peut dire OK car tu te sert des outils pour t'aider à formuler et répondre.

            Mais juste sortir la conv complète de ChatGPT, autant ne pas répondre.

            -
            Edité par quenti77 31 janvier 2023 à 8:02:00

            • Partager sur Facebook
            • Partager sur Twitter
              29 janvier 2023 à 15:03:01

              Utiliser ChatGPT m'as permis de pas passer 1/2 heure sur la documentation des API's de Google, car il en a extrait le morceau nécessaire et a même générer des codes illustratif à partir de ça.

              J'ai déjà utiliser Firebase dans différents projet et bien avant que ChatGPT existe, que ce soit des projets web  où des applications mobile avec React Native et les documentations de Google sont vraiment volumineuse si retrouver dedans demande un certain temps (voir un temps incertain), et honnêtement si je l'avais fait manuellement je ne vois pas ce que j'aurais sortie de plus à sa question, par apport à ce qu'a fait l'IA en une poignée de secondes.

              Alors oui très clairement quand je vois que l'IA peut me sortir un résultat comme ça en une poignée de secondes, je n'ai clairement pas envie (d'ailleurs personne n'a envie) de passer 1/2 heure à aller bouquiner la doc pour te sortir des références et te construire  des codes illustratifs. 

              Est-ce que toi tu vois une imprécision dans les réponse de l'IA qui demanderait explications ?

              • Partager sur Facebook
              • Partager sur Twitter

              suggestion de présentation.

                29 janvier 2023 à 15:17:34

                Merci pour la réponse, j'utilise beaucoup chatGPT. En plus de m'aider ça m'a permis de comprendre ta logique avec ChatGPT. Donc c'est doublement bénéfique. Je vais essayer ce que ChatGPT m'a/t'a proposer
                • Partager sur Facebook
                • Partager sur Twitter
                  29 janvier 2023 à 15:27:55

                  Derien, et comme je disais c'est pas dénuer de sens de filer une réponse de ChatGPT parce que faut déjà avoir une certaine compréhension de Javascript pour lui donner une question "mangeable" pour qu'il pondent un truc utilisable, et remarquer les imprécisions qu'il fait parfois (car oui il en fait du code non optimiser) et lui demander d'optimiser tel ou tel chose en la remplaçant par tel ou tel autre chose.

                  Ici typiquement le fait de lire tous les documents indépendamment de leurs nombres, si ça nous traverse pas l'esprit de se dire que sans système de pagination on va avoir des gros problèmes de performances, ben ChatGPT il fera rien pour ça.

                  Où si on ne s'est pas que le système de pagination qu'à utiliser ChatGPT par défaut est très douteux pour cette API car l'utilisation de la méthode offset et facturer comme une lecture pour chaque décalage de document, ben on se retrouve aussi avec des surprise.

                  Donc, juste ChatGPT sans aucune notion de Javascript, où de l'API en question, ça marche pas.

                  -
                  Edité par SamuelGaborieau3 29 janvier 2023 à 15:29:45

                  • Partager sur Facebook
                  • Partager sur Twitter

                  suggestion de présentation.

                    29 janvier 2023 à 15:32:36

                    Jeconfirme, il faut savoir lui poser les bonnes question. La réponse n'a pas fonctionné tel quel, mais j'ai donc reformuler ma question à GPT et voici ça réponse qui fonctionne, sans rien changer.

                    Bonjour, tu est un développeur React Native et tu m'aide dans la conception de mon application mobile, cette application permet au utilisateur d'enregistré leurs plantes.
                    Les données sont stocké sur une base de données firebase, sur cloud firestore pour être plus précis.
                    Le schéma de donnée est comme ceci :
                    une collections users avec un document par utilisateur, ce document contiens une collection de plusieurs plantes avec un uid, chaque collection de plantes contiens un document avec le nom de la plantes et autre information.
                    Je souhaite que tu m'écrive le code pour récupérer la liste des plantes d'un utilisateur.
                    Pour récupérer la liste des plantes d'un utilisateur, vous pouvez utiliser le code suivant en utilisant la bibliothèque Firebase pour React Native :
                    import firebase from 'firebase/app';
                    import 'firebase/firestore';
                    
                    const firestore = firebase.firestore();
                    
                    const getUserPlants = async (userId) => {
                      const userRef = firestore.collection('users').doc(userId);
                      const plantsSnapshot = await userRef.collection('plants').get();
                      return plantsSnapshot.docs.map((plantDoc) => plantDoc.data());
                    };
                    Ce code importe la bibliothèque Firebase pour React Native, puis initialise une instance de Firestore. Ensuite, il définit une fonction getUserPlants qui accepte un identifiant d'utilisateur en tant qu'argument. La fonction crée une référence au document d'utilisateur à partir de la collection users, puis récupère la collection de plantes associée à l'utilisateur en utilisant .collection('plants'). Finalement, la fonction renvoie les données de chaque document de plante en utilisant la méthode map sur le résultat de la requête.

                    -
                    Edité par Jeffbzh3 29 janvier 2023 à 15:33:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 janvier 2023 à 15:55:05

                      Oui, l'IA a ajouter l'initialisation de firestore et a groupé le fetch de l'utilisateur avec celui des plants.

                      Il y a toujours pas de système de pagination dans ce code là mais pour des tests au des cas simples (des cas ou les nombres de plants par utilisateur ne peut pas dépasser une vingtaines d'entrées) ca fonctionnera correctement quand même.

                      Je pensais pas qu'on pouvait d'écrire aussi précisément un scénario a ChatGPT, mais bon je c'est pas si je l'utiliserais se système là.

                      J'aime bien l'utiliser pour lui demander de générer un code d'exemple d'une API en particulière pour visualiser comment elle pourrait être utiliser quand je trouve la documentation pas assez explicite. Je lui fait pas confiance pour générer du code final directement. 

                      En reprenant ce code et en lui demandant d'ajouter un système de pagination il génère ça:

                      import firebase from 'firebase/app';
                      import 'firebase/firestore';
                       
                      const firestore = firebase.firestore();
                      
                      // nombre maximum de plantes par page
                      const PAGE_SIZE = 10;
                      
                      const getUserPlants = async (userId, page = 1) => {
                        const userRef = firestore.collection('users').doc(userId);
                        const plantsSnapshot = await userRef.collection('plants')
                          .limit(PAGE_SIZE)
                          .offset((page - 1) * PAGE_SIZE)
                          .get();
                        return plantsSnapshot.docs.map((plantDoc) => plantDoc.data());
                      };
                      

                      Avec le même défaut que tous à l'heure, il se base sur la méthode offset pour le système de pagination, donc au niveau de la facturation de l'API de firestore tu n'économises rien.

                      Par contre les données renvoyait au client sont plus légère donc pour la bande passante tu peux faire des économies.

                      • Partager sur Facebook
                      • Partager sur Twitter

                      suggestion de présentation.

                      Accès au données de firestore firebase

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown