‫Instructeur : Vous vous souvenez de la façon
‫dont nous avons un champ pour la note moyenne sur chaque document de visite ?
‫Jusqu'à présent, ce champ ne contient pas vraiment de
‫données significatives, n'est-ce pas ?
‫Mais changeons maintenant cela et
‫calculons les notes moyennes dans cette conférence.
‫Ainsi, le stockage d'un résumé d'un ensemble de données associé
‫sur l'ensemble de données principal est en fait une technique très populaire
‫dans la modélisation de données que je n'avais pas encore mentionnée.
‫Et cette technique peut en fait être très
‫utile afin d'éviter des requêtes
‫constantes sur l'ensemble de données associé.
‫Ainsi, dans notre application, un excellent exemple de cette technique
‫consiste à stocker la note moyenne et le nombre de
‫notes sur chaque visite, afin que nous n'ayons pas à interroger les
‫critiques et à calculer cette moyenne chaque fois que nous
‫interrogeons pour toutes les visites, d'accord.
‫Par exemple, cela pourrait devenir très
‫utile pour une page d'aperçu de la tournée dans notre
‫front-end où nous ne voulons vraiment pas afficher toutes les
‫critiques, mais voulons quand même afficher un résumé de ces
‫critiques, comme par exemple, le nombre de notes et la moyenne.
‫Et en fait, nous avons déjà les champs pour cela
‫dans notre schéma de tournée.
‫Donc juste ici au début, je pense.
‫Oui, nous avons donc la
‫moyenne des notes et le nombre de
‫notes ici, mais pour le moment ce ne sont
‫que quelques chiffres et bien sûr, ce ne sont pas
‫la moyenne réelle et le nombre de notes,
‫car nous n'avons jamais vraiment calculé cela à aucun moment dans notre
‫application, mais c'est exactement ce que nous allons changer dans cette vidéo.
‫Alors maintenant, nous allons calculer la note moyenne et
‫aussi le nombre de notes d'une tournée
‫à chaque fois qu'une nouvelle critique est ajoutée à cette
‫tournée ou aussi lorsqu'une critique est mise à jour ou supprimée,
‫car c'est exactement les situations
‫où le nombre ou la moyenne pourrait changer, à droite.
‫Alors, comment allons-nous réellement mettre en œuvre cela?
‫Eh bien, ici, dans le modèle de révision, nous
‫allons créer une nouvelle fonction
‫qui prendra en compte un identifiant
‫de tournée et calculera la note moyenne et le
‫nombre de notes qui existent dans notre collection pour cette tournée exacte.
‫Ensuite, à la fin, la fonction mettra même à
‫jour le document de visite correspondant.
‫Ensuite, afin d'utiliser cette fonction, nous utiliserons
‫un middleware pour appeler cette fonction chaque fois qu'il
‫y a une nouvelle révision ou qu'une est mise
‫à jour ou supprimée, d'accord.
‫Commençons donc maintenant par écrire cette fonction et pour
‫cela, nous allons en fait écrire une méthode statique sur
‫notre schéma, et c'est une fonctionnalité de Mongoose que
‫nous n'avions pas encore utilisée.
‫Nous n'avons donc utilisé que des méthodes
‫d'instance, que nous pouvons appeler sur
‫des documents et elles
‫sont aussi très utiles, mais cette fois nous allons vraiment utiliser des méthodes statiques.
‫D'accord.
‫Encore une fois, ceux-ci peuvent être appelés directement sur le modèle,
‫par exemple, comme cette revue. calcStats, d'accord.
‫Et la façon dont cela fonctionne est bien sûr
‫reviewSchema et ensuite . statique, puis le nom de la fonction.
‫Donc calcAverageRatings
‫est égal à une fonction, qui mémorise un ID de tournée,
‫et cet ID est bien sûr pour
‫la tournée à laquelle appartient l'examen en cours.
‫Et je sais qu'à ce stade, tout cela semble probablement un peu
‫déroutant, mais ne vous inquiétez pas une fois
‫que tout cela aura été mis
‫en œuvre et que lorsque
‫nous le testerons, cela aura alors beaucoup de sens dans la pratique, d'accord ?
‫Quoi qu'il en soit, pour faire maintenant le
‫calcul, nous utiliserons à nouveau le pipeline d'agrégation, à droite.
‫Souvenons-nous donc que dans notre contrôleur d'outils, nous utilisons
‫ici le pipeline d'agrégation pour
‫créer également des statistiques comme celle-ci, d'accord.
‫Nous avons donc utilisé la méthode agrégée, que nous avons appelée
‫directement sur le modèle, d'accord.
‫Alors maintenant, dans notre méthode d'instance, nous pouvons faire
‫exactement la même chose.
‫Ainsi, dans une méthode statique comme celle-ci, ces mots-clés pointent
‫en fait vers le modèle actuel.
‫C'est pourquoi nous pouvons l'utiliser. agrégé, car rappelez-vous
‫que nous devons appeler cela. agréger directement sur
‫le modèle, et c'est exactement pourquoi
‫nous utilisons ici une méthode statique en premier lieu.
‫Parce qu'à nouveau, cela pointe maintenant vers
‫le modèle et nous devons toujours appeler l'agrégat sur le modèle, d'accord.
‫Donc, dans l'agrégat, nous devons passer un tableau
‫de toutes les étapes que nous voulons dans l'ensemble, d'accord.
‫Alors, que voulons-nous faire en premier ?
‫Eh bien, la première étape devrait être de sélectionner toutes les critiques
‫qui appartiennent réellement à la tournée
‫en cours et qui ont été transmises comme argument.
‫D'accord.
‫Donc, notre première étape est une étape de correspondance, souvenez-vous de
‫cela, et
‫donc ici nous avons passé notre objet
‫de filtre et nous pouvons dire tour égal à
‫tour, mais nous n'en avons pas vraiment
‫besoin, comme vous le savez déjà, et donc supprimons simplement ceci partie, ou en
‫fait juste pour le rendre un peu moins confus
‫ici avec les noms, appelons celui-ci ici l'identifiant de la tournée, d'accord.
‫Alors tourId ici,
‫d'accord.
‫Donc, comme ça, nous sélectionnons
‫uniquement une tournée que nous voulons réellement mettre à jour, d'accord.
‫Maintenant, dans l'étape suivante, calculons en
‫fait les statistiques elles-mêmes, et
‫pour cela, nous utilisons une étape de groupe.
‫Et dans la phase de groupe,
‫rappelez-vous que le premier champ que nous devons spécifier est l'ID, donc _id, puis le
‫champ commun que tous
‫les documents ont en commun et
‫que nous voulons regrouper et ce sera à
‫nouveau la tournée.
‫Donc, tout comme dans notre exemple de calcul statistique précédent,
‫nous avons regroupé ici par difficulté.
‫Ainsi, nous calculons les statistiques pour les circuits faciles et
‫les statistiques pour les
‫circuits moyens, puis les statistiques pour les circuits difficiles.
‫Donc, dans cet exemple, nous avons regroupé toutes
‫les visites par difficulté,
‫d'accord.
‫Mais ici, bien sûr, nous regroupons toutes les tournées
‫par tournée.
‫Super.
‫Maintenant, le nombre d'évaluations, rappelez-vous comment
‫nous procédons, donc
‫tout ce que nous faisons est d'en
‫ajouter une pour chaque tournée que
‫nous avons, donc chaque tournée qui correspond à l'étape précédente, d'accord.
‫Donc, s'il y a cinq documents de révision pour la
‫tournée en cours, un sera ajouté pour chacun de ces documents.
‫Donc, à la fin, le nombre de notes sera de
‫cinq, et encore une fois, car bien sûr, nous avons cinq documents d'examen.
‫Alors ça a du sens, non ?
‫Puis aussi la note moyenne, qui, comme avant, nous utilisons l'opérateur
‫moyen et cela doit être à l'intérieur d'un objet et
‫ici
‫le nom du champ
‫qui est la note, à droite.
‫Souvenez-vous donc que chaque avis a un champ d'évaluation.
‫C'est donc de là que nous voulons calculer la moyenne.
‫D'accord, et c'est en fait tout.
‫Le nombre et la moyenne des notes
‫sont donc exactement ce que nous voulions calculer dans cette agrégation.
‫Maintenant, gardez à l'esprit que cela renvoie en
‫fait une promesse et nous devons donc l'attendre, puis la
‫stocker dans une variable appelée stats.
‫D'accord.
‫Ensuite, marquez celui-ci ici comme asynchrone,
‫sauvegardez-le
‫et nous devons maintenant utiliser cette variable de statistiques.
‫Pour l'instant, tout ce que je veux vraiment faire
‫pour tester cela, c'est d'enregistrer les statistiques sur la console.
‫Console. statistiques
‫de journal.
‫D'accord, alors dans l'étape ultérieure, nous voudrons réellement, comme je l'ai
‫mentionné auparavant, mettre à jour le document de la tournée
‫avec ces statistiques, mais je
‫vais laisser cela un peu plus tard,
‫car pour l'instant, nous devons en
‫fait appeler cette méthode ici quelque part ,
‫car sinon les statistiques ici ne seront jamais appelées.
‫Et rappelez-vous comment nous avons dit
‫au début que nous le ferions en utilisant
‫un middleware chaque fois qu'un nouvel avis est créé.
‫Implémentons donc cela en utilisant reviewSchema pre save,
‫puis
‫notre fonction middleware normale normale ici.
‫Et rappelez-vous que dans ce
‫type de middleware, ce mot-clé pointe
‫vers le document en cours d'enregistrement.
‫Donc, cela pointe vers
‫l'examen actuel, d'accord.
‫Nous voudrons donc appeler la fonction calcAverageRating
‫en utilisant ceci. tournée, à droite.
‫Maintenant, comment allons-nous réellement appeler cette fonction ?
‫Rappelez-vous comment j'ai
‫dit que cette fonction est disponible sur le modèle.
‫Donc, fondamentalement, comme cette critique
‫de mise. calcAverageRatings, puis, comme
‫je l'ai dit, nous voulons l'utiliser. tournée, d'accord.
‫Et encore une fois, parce qu'il s'agit de
‫l'examen en cours et que c'est alors l'ID de tournée que nous
‫allons transmettre à l'intérieur de calcAverageRatings.
‫Maintenant, le problème est qu'à ce stade du code,
‫la variable de révision n'est pas encore définie.
‫Maintenant, vous pourriez penser que la solution simple serait
‫de simplement déplacer ce code ici après cette déclaration de révision, mais malheureusement,
‫cela ne fonctionnera pas, car tout comme
‫dans Express, ce code ici s'exécute essentiellement dans l'ordre
‫dans lequel il est déclaré.
‫Donc, si nous devions mettre ce code
‫ici après la déclaration de révision, alors ce reviewSchema ici
‫ne contiendrait pas ce middleware, car
‫nous ne le déclarerions alors qu'une
‫fois le modèle de révision déjà créé, d'accord, mais il y
‫a heureusement encore un moyen de contourner cela et
‫c'est d'utiliser ceci. constructeur.
‫Donc ceci ici pointe toujours vers le modèle.
‫Vous savez, encore une fois, il s'agit du document actuel
‫et le constructeur est essentiellement le modèle
‫qui a créé ce document.
‫Donc, ici, cela représente la
‫tournée et nous pouvons donc simplement le faire comme ça.
‫Ensuite, appelez le suivant comme toujours et c'est tout.
‫Alors allons-y maintenant et testons cela.
‫Et pour ce faire, je vais d'abord créer une nouvelle
‫tournée, car les autres que nous avons
‫déjà ont la moyenne et
‫le nombre d'évaluations déjà calculés et
‫nous voulons donc vraiment repartir de zéro ici pour tester cela.
‫Donc, pour créer une nouvelle tournée, nous devons être connectés
‫en tant qu'administrateurs, et je pense que nous le sommes actuellement, mais
‫juste pour être sûr de recommencer.
‫D'accord.
‫Voici donc la nouvelle tournée d'essai.
‫Très bien, supprimons-les ici, ils ne sont pas obligatoires, et je
‫pense qu'avec cela, nous sommes prêts à partir.
‫Très bien, et ici vous voyez les valeurs par défaut que nous
‫avons définies auparavant, donc la moyenne des
‫notes est de cinq et la quantité définie à zéro, d'accord.
‫Maintenant, afin de créer un nouvel avis, nous devons en
‫fait être connectés en tant qu'utilisateur régulier, et
‫non en tant qu'administrateur.
‫Alors, disons un utilisateur normal.
‫Alors utilisons simplement cette Laura ici.
‫Alors Laura@exemple. com et
‫comme je l'ai mentionné plus tôt, le mot de passe est toujours le même.
‫Alors faisons-le et maintenant nous allons créer une nouvelle critique en tournée.
‫Alors maintenant, récupérons la visite que nous avons
‫créée plus tôt, donc cet identifiant et mettez-le ici dans l'URL.
‫D'accord, et rappelez-vous que cet itinéraire obtient
‫désormais automatiquement un identifiant de tournée à partir de
‫l'URL et un identifiant d'utilisateur de l'utilisateur actuellement connecté,
‫d'accord.
‫Alors utilisons celui-ci comme première note,
‫envoyons-le, et maintenant je veux jeter un œil à notre console.
‫Nous avons une sortie ici, mais pour une raison quelconque,
‫c'est seulement comme ce tableau vide.
‫Donc quelque chose ne doit pas fonctionner ici.
‫Jetons donc un coup d'œil à l'ID de la tournée ici juste
‫pour nous assurer que nous obtenons la bonne valeur ici, ID et commentons
‫également cette partie ici juste
‫pour voir s'il y a peut-être une erreur dans cette
‫partie, et alors essayons maintenant encore une fois.
‫Je vais simplement ajouter le même ici à nouveau, d'accord.
‫D'accord, alors maintenant, nous obtenons quelque chose.
‫Nous avons donc cette revue qui est
‫celle que nous avons créée initialement.
‫Donc ça commence par cet ac15,
‫mais celui que je viens de créer est ce 66d, d'accord.
‫Jetons donc un œil à cela ici dans Compass.
‫Nous devons donc aller à la dernière page.
‫D'accord, et donc celui qui apparaît dans notre console
‫n'est que celui-ci ici, mais pas le deuxième
‫que nous venons de créer, d'accord.
‫Donc, si nous en créons maintenant
‫un troisième, nous devrions probablement voir le premier et le deuxième.
‫Alors essayons ça.
‫D'accord.
‫Envoyez celui-ci et maintenant ici dans notre sortie,
‫je les reçois tous les trois.
‫Donc cela n'a pas beaucoup de sens, mais de toute
‫façon, le point que je voulais faire ici est
‫que nous ne devrions pas utiliser
‫pre, mais à la place nous devrions utiliser le middleware post save, d'accord.
‫Et c'est parce qu'à la pré-sauvegarde,
‫la critique actuelle n'est
‫pas encore vraiment dans la collection.
‫Par conséquent, lorsque nous faisons ensuite cette correspondance ici, elle
‫ne devrait pas pouvoir apparaître dans la sortie ici,
‫car encore une fois, à
‫ce stade, elle n'est pas encore vraiment enregistrée dans la collection, d'accord.
‫Il est donc préférable d'utiliser poster
‫ici, car à ce moment-là, bien sûr,
‫tous les documents sont déjà enregistrés dans la base de données
‫et c'est donc le
‫moment idéal pour faire ce calcul avec tous les avis déjà,
‫puis stocker le résultat sur la tournée .
‫D'accord, donc je ne sais
‫pas vraiment pourquoi celui-ci ici est réellement apparu
‫à ce stade, mais de toute façon essayons maintenant avec un autre.
‫C'est donc le quatrième, et
‫maintenant nous obtenons suivant n'est pas une fonction et en effet, comme
‫je l'ai mentionné plus tôt, le post
‫middleware n'a pas accès à suivant
‫et donc, nous ne pouvons bien sûr pas l'appeler, ne pouvons
‫pas l'utiliser.
‫Très bien, et nous avons donc ici notre prochaine
‫note, d'accord.
‫Donc, il apparaît maintenant ici aussi.
‫Nous n'avons donc pas besoin de cela et nous pouvons maintenant essayer
‫de calculer nos statistiques en toute sécurité ici.
‫Faites une sauvegarde et supprimons en
‫fait tous ces avis.
‫Donc, je veux essentiellement recommencer à zéro, d'accord.
‫Donc, toutes
‫ces cinq critiques ici devraient disparaître et maintenant
‫nous sommes prêts à partir.
‫Créons donc celui-ci comme le premier et
‫maintenant allons-y, jetons un coup d'œil à nos statistiques et
‫c'est parti.
‫Il s'agit donc de l'identifiant actuel
‫de la tournée, le nombre d'évaluations est de un
‫et la moyenne est bien sûr de trois.
‫Donc, si nous en ajoutons un autre avec une note de cinq, la
‫moyenne devrait être de quatre et nous
‫devrions avoir un nombre de notes égal à deux.
‫Alors essayons cela et en effet, comme je l'ai dit,
‫deux notes, une moyenne de quatre.
‫Et juste un autre juste pour être vraiment sûr,
‫ajoutons un autre
‫avec cinq, et c'est parti.
‫Super.
‫Nous calculons donc correctement les statistiques, mais bien sûr,
‫elles ne sont pas encore
‫conservées dans le document de tournée actuel.
‫Donc si nous venons ici à Compass pour la tournée
‫que nous venons de
‫créer, c'est probablement la dernière ici.
‫Oui, donc notre tour de test, il a toujours ces valeurs
‫par défaut de 4. 5 et zéro,
‫d'accord.
‫Alors maintenant, il est temps
‫de conserver les statistiques calculées dans ce document de
‫tournée, d'accord.
‫Et alors faisons-le.
‫Tout d'abord, pour pouvoir faire cela,
‫nous devons exiger le modèle de tournée, n'est-ce pas.
‫Donc tournée
‫oblige
‫et c'est parti.
‫Donc, ce que nous devons faire, c'est essentiellement trouver
‫la tournée actuelle, puis la mettre à jour.
‫Nous l'avons donc fait plusieurs fois, findById
‫et mise à jour,
‫d'accord.
‫Et l'ID est bien sûr l'ID de la tournée qui a
‫été transmis à la fonction, puis
‫un objet des données que nous voulons réellement mettre à jour.
‫Alors, récupérons ces noms de champs à partir d'ici.
‫Nous avons donc des cotesQuantité
‫d'une part.
‫Mettons-le ici à un pour l'instant juste pour
‫que nous n'ayons pas d'erreur
‫et de notes moyennes.
‫Encore une fois, pour éviter toute
‫erreur, car maintenant je veux
‫venir ici et jeter un œil à ces statistiques.
‫Donc, vous voyez qu'ils sont stockés dans un tableau en fait, d'accord.
‫Nous devons donc aller à la première position de ce tableau,
‫où se trouve cet objet.
‫Donc, les statistiques à la position
‫zéro et à partir de là, nous obtenons la propriété d'évaluation finale,
‫d'accord.
‫Alors celui-ci ici.
‫Et puis bien sûr idem pour la note moyenne.
‫D'accord.
‫Et maintenant, nous devons aussi l'attendre.
‫Donc comme toujours cela renvoie une prémisse et donc on peut l'attendre.
‫Maintenant, nous pourrions également stocker le résultat de ceci dans une variable, mais
‫nous n'avons pas vraiment besoin du tour du tout.
‫Tout ce que nous voulons faire, c'est vraiment le
‫mettre à jour, et donc
‫nous ne stockons nulle part la valeur des résultats de la prémisse.
‫D'accord.
‫Essayons donc simplement d'ajouter une autre critique ici,
‫cette fois avec une terrible.
‫D'accord.
‫Et tout d'abord, regardons les statistiques.
‫Alors bien sûr, on obtient la note de quatre, donc le nombre de
‫notes, et la moyenne de 3. 5.
‫Alors maintenant, afin de vraiment voir si cela a
‫fonctionné, regardons Compass ou nous pouvons également utiliser ou obtenir
‫le point de fin de la
‫tournée, d'accord.
‫Nous avons donc besoin de l'identifiant de la tournée, que
‫nous pouvons copier à partir d'ici, le coller ici, et maintenant
‫vient le moment et en effet cela a
‫fonctionné, parfait.
‫Alors c'est génial, absolument fantastique.
‫Encore une fois pour le plaisir, ajoutons
‫une autre critique ici.
‫D'accord.
‫Mettez à jour celui-ci, et maintenant nous en obtenons
‫cinq et notre moyenne a légèrement augmenté.
‫Super.
‫Prenons maintenant une seconde et récapitulons ce que nous avons fait ici.
‫Nous avons donc commencé par créer une méthode statique.
‫Donc, toute cette fonction
‫ici pour créer essentiellement les statistiques de
‫la moyenne et du nombre d'évaluations pour l'ID
‫de tournée pour lequel l'évaluation actuelle a été créée, d'accord.
‫Et nous avons créé cette fonction en tant
‫que méthode statique, car nous devions appeler la fonction d'agrégation
‫sur le modèle.
‫Ainsi, dans une méthode statique, cette variable
‫appelle exactement une méthode.
‫C'est donc très pratique dans ces cas.
‫Nous avons donc construit notre pipeline d'agrégation ici où
‫nous avons sélectionné tous les avis qui correspondent
‫à l'ID de tournée actuel, puis ils sont calculés,
‫les statistiques de tous ces avis.
‫Ensuite, une fois cela
‫fait, nous avons enregistré les statistiques sur la tournée en cours, d'accord.
‫Ensuite, afin d'utiliser réellement
‫cette fonction, nous l'appelons après la création d'un nouvel avis, d'accord.
‫Pour cela, nous devons utiliser ceci. constructeur car c'est
‫ce qui pointe vers le modèle actuel.
‫Maintenant, gardez à l'esprit comment nous avons dit que
‫nous voulions également mettre à jour les statistiques chaque fois qu'un avis est
‫modifié ou supprimé, car ces
‫actions, bien sûr, influenceront également le nombre et la moyenne.
‫Cependant, le faire est un peu plus complexe.
‫Donc, puisque cette vidéo dure déjà assez longtemps, laissons
‫cela à la suivante.