‫Narrateur : Bon retour.
‫Dans cette vidéo et
‫la suivante, je souhaite vous
‫présenter le pipeline d'agrégation MongoDB, qui est un framework
‫MongoDB extrêmement puissant et extrêmement utile pour
‫l'agrégation de données.
‫Et l'idée est que
‫nous définissons essentiellement un pipeline par lequel
‫tous les documents d'une certaine
‫collection passent par où ils sont
‫traités étape par étape afin de les transformer en résultats agrégés.
‫Par exemple, nous pouvons utiliser le pipeline d'agrégation
‫pour calculer des moyennes ou calculer des
‫valeurs minimales et maximales ou nous pouvons même
‫calculer des distances, et nous pouvons vraiment
‫faire toutes sortes de choses.
‫C'est vraiment incroyable à quel point
‫ce pipeline d'agrégation est puissant.
‫D'accord, mais assez parlé.
‫Commençons maintenant à utiliser le pipeline d'agrégation et je
‫vais créer une nouvelle fonction d'en-tête ici, car
‫plus tard, nous définirons une nouvelle route, puis
‫utiliserons cette fonction pour cela.
‫Mais cette nouvelle route, je vais la créer plus tard.
‫Je veux donc créer une
‫fonction ici qui va calculer quelques statistiques sur nos tournées.
‫Je vais donc appeler celui-ci getTourStats.
‫D'accord, donc Stats pour les statistiques, et
‫ce sera une fonction
‫asynchrone et donc un code vs maintenant automatiquement pré-rempli à partir de cela.
‫Très bien, créons ou essayons le bloc catch ici.
‫En fait, je vais copier cela à partir
‫d'ici, et maintenant ici, je vais créer
‫une variable appelée stats.
‫Maintenant, le pipeline d'agrégation est vraiment une fonctionnalité MongoDB.
‫Mais Mongoose, bien sûr, nous y donne accès,
‫afin que nous puissions l'utiliser dans le pilote Mongoose, n'est-ce pas ?
‫Donc, en utilisant notre modèle de tournée
‫pour accéder à la collection de tournées, nous
‫disons tournée. agrégat.
‫Et donc le pipeline d'agrégation est un
‫peu comme une requête régulière et donc en utilisant le
‫pipeline d'agrégation c'est un peu comme faire une requête régulière.
‫La différence ici est que dans les agrégations,
‫comme je l'ai déjà mentionné, nous pouvons manipuler
‫les données en plusieurs étapes
‫différentes et définissons donc maintenant ces étapes.
‫Et pour cela, on passe dans une panoplie de soi-disant étapes.
‫Donc on passe dans un tableau, et puis ici
‫on aura alors beaucoup d'étapes.
‫Et à nouveau, les documents passent ensuite par ces étapes
‫une par une, étape par étape dans la séquence de définition
‫telle que nous la définissons ici.
‫Ainsi, chacun des éléments de ce
‫tableau sera l'une des étapes.
‫Et il y a une tonne d'étapes différentes parmi
‫lesquelles nous pouvons choisir, mais je vais juste vous
‫dire les plus courantes dans cette conférence
‫et aussi dans la suivante.
‫Mais de toute façon, je veux maintenant prendre
‫une minute et jeter un coup d'œil à la documentation de MongoDB parce
‫que je pense que nous ne l'avons pas encore fait.
‫Donc MongoDB et nous connaissons déjà ce site.
‫Donc, sur notre site Web MongoDB, nous allons
‫ici pour apprendre, puis la documentation, puis
‫ici, nous sélectionnons le manuel MongoDB et cette documentation est énorme.
‫C'est vraiment, il y a beaucoup de
‫choses ici et si vous
‫deviez tout traverser, eh bien, vous deviendriez vraiment un maître MongoDB.
‫Cela vous donne donc une belle introduction à MongoDB,
‫vous avez l'installation ici.
‫Vous avez les opérations CRUD, donc un bon aperçu de
‫beaucoup de choses que
‫nous avons déjà apprises auparavant, n'est-ce pas ?
‫Ensuite, vous avez des trucs sur l'agrégation
‫et en particulier, le pipeline d'agrégation dont nous
‫allons parler maintenant, mais ce
‫que je veux vraiment vous montrer ici, c'est
‫en fait cette référence que nous avons en bas parce que
‫dans la référence que nous avons ici pour
‫exemple les opérateurs et c'est là que
‫nous avons beaucoup de choses importantes que nous utilisons tout le temps.
‫Jetons donc un coup d'œil ici
‫aux opérateurs de requête, par exemple et ici, vous voyez, nous avons en fait
‫ces opérateurs que nous avons déjà utilisés.
‫Par exemple, supérieur ou égal, ou inférieur et
‫égal, mais si un jour, dans
‫vos propres applications, vous avez besoin d'un autre
‫opérateur, eh bien, vous savez maintenant où les trouver.
‫Maintenant, bien sûr, il est également toujours très
‫utile de faire une recherche rapide sur Google, probablement
‫de trouver un article sur le débordement de la pile à
‫ce sujet, mais croyez-moi, il est
‫souvent plus facile et plus rapide de simplement sauter rapidement dans la documentation et
‫de rechercher rapidement tout ce que vous ' re besoin.
‫Vous avez juste besoin de savoir comment fonctionne
‫la documentation et une fois que vous le savez, il
‫vous sera alors assez facile de trouver ce que vous cherchez, d'accord ?
‫Ici, vous avez également quelques opérateurs
‫logiques par exemple, l'opérateur OU que nous avons déjà utilisé.
‫Encore une fois, vraiment beaucoup de choses, des opérateurs géospatiaux et nous en
‫utiliserons en fait, plus tard, et
‫oui, vraiment beaucoup de choses.
‫Ensuite, ce que je voulais vous montrer après cette conférence en
‫fait, ce sont les étapes du pipeline d'agrégation.
‫Donc ici vous en avez beaucoup et
‫ce que nous allons utiliser dans cette conférence
‫ici, c'est le match, par exemple et le groupe,
‫où est-ce ?
‫Oui, c'est un groupe très important, et comme je
‫l'ai mentionné, je vais vous
‫montrer les plus importants de cette conférence et de la suivante.
‫Mais encore une fois, si dans certains cas vous avez besoin
‫d'autre chose, alors allez-y, venez ici à cette documentation
‫et vous trouverez ce que vous cherchez.
‫D'accord?
‫Quoi qu'il en soit, apprenons maintenant comment nous pouvons réellement
‫définir l'une de ces étapes, d'accord ?
‫Et je vais commencer par le match.
‫Et la correspondance consiste essentiellement
‫à sélectionner ou à filtrer certains documents.
‫Et donc c'est très simple.
‫C'est vraiment comme un objet filtre dans MongoDB, comme
‫nous l'avons utilisé tant de fois.
‫Donc chacune des étapes est un
‫objet et puis voici le nom de l'étape.
‫Donc celui-ci est l'étape du match, d'accord ?
‫Et comme je l'ai mentionné, c'est vraiment juste une requête.
‫Et donc disons que pour commencer, nous voulons uniquement sélectionner
‫des documents qui ont une
‫note moyenne supérieure ou égale à 4. 5.
‫Alors pouvez-vous faire ça ?
‫Je vais juste vous donner une seconde pour le faire ici.
‫Alors j'espère que tu l'as fait.
‫La moyenne des notes doit donc être supérieure ou
‫égale à 4. 5.
‫Et voilà, c'est la première étape.
‫Et généralement, cette étape de match n'est qu'une étape préliminaire
‫pour ensuite préparer les prochaines étapes à venir.
‫Donc, le prochain est maintenant la phase de groupes.
‫Donc groupe et
‫là, nous devons toujours passer juste un autre objet.
‫Cela semble donc un peu bizarre avec tous ces
‫objets, mais, oui, vous l'avez déjà vu et
‫MongoDB fonctionne de cette façon.
‫Ce sont toujours des objets, à l'intérieur des objets, à l'intérieur des objets.
‫Et ce groupe ici est l'endroit où la vraie magie
‫opère car comme son
‫nom l'indique, il nous permet de regrouper
‫des documents, essentiellement à l'aide d'accumulateurs.
‫Et un accumulateur est par
‫exemple, même en train de calculer une moyenne.
‫Donc, si nous avons cinq circuits, chacun d'eux a une
‫note, nous pouvons alors calculer la note moyenne en utilisant le groupe.
‫Et alors faisons exactement cela ici.
‫Maintenant, la première chose, c'est que nous
‫devons toujours spécifier l'identifiant car c'est là que nous allons spécifier
‫ce que nous voulons regrouper.
‫Pour l'instant, nous disons nul ici car nous voulons
‫tout avoir dans un seul groupe afin de pouvoir calculer
‫les statistiques de toutes les tournées ensemble et
‫ne pas les séparer par groupes.
‫Nous allons, un peu plus tard, grouper également par différentes choses,
‫par exemple, nous pouvons regrouper par difficulté et
‫nous pouvons ensuite, par exemple, calculer la moyenne pour
‫les circuits faciles, la moyenne pour les circuits moyens
‫et la moyenne pour les circuits difficiles.
‫Encore une fois, nous pouvons regrouper par l'un de nos champs
‫et ce champ, nous allons le spécifier ici, mais pour
‫l'instant, comme je l'ai dit, nous voulons calculer ces moyennes pour
‫toutes les tournées ensemble dans un grand groupe.
‫Donc, dans ce cas, nous disons _id et le définissons sur null.
‫Calculons maintenant la note moyenne.
‫Pour ce faire, nous spécifions simplement un
‫nouveau champ, appelons-le simplement la note moyenne, donc
‫comme ça, et ce sera
‫bien la moyenne,
‫qui est encore un autre opérateur MongoDB, donc celui-ci ici.
‫Vous le trouverez dans la référence si vous le recherchez.
‫Il s'agit donc d'un opérateur mathématique calculant
‫la moyenne et maintenant le nom du champ.
‫Et encore une fois, je sais que cela va sembler
‫très étrange, mais afin de spécifier le champ à partir
‫duquel nous voulons calculer la moyenne, nous devons utiliser
‫le signe dollar, mais entre guillemets ici et puis
‫le nom du champ.
‫Donc, les notes sont moyennes dans ce cas.
‫Et calculons aussi le prix moyen.
‫Donc le prix moyen, et encore une fois, s'est trompé ici,
‫et donc
‫la moyenne et encore une fois, le
‫nom du champ et entre guillemets et
‫avec ce signe dollar.
‫D'accord, donc ça a l'air un peu
‫bizarre encore, mais
‫c'est juste la façon dont fonctionne le pipeline d'agrégation.
‫Nous avons donc le prix moyen.
‫Calculons en fait aussi le prix minimum,
‫donc le plus petit prix, et le plus grand prix.
‫Donc minPrice
‫et à partir de maintenant, tout va se ressembler,
‫donc maintenant nous utilisons
‫l'opérateur min, puis à nouveau le nom du champ comme celui-ci.
‫Et une virgule ici et dupliquons maintenant simplement
‫celle-ci afin de calculer le prix maximum.
‫Et maintenant, jetons un coup d'œil à ce que nous
‫avons déjà obtenu à ce stade.
‫Nous devons donc maintenant envoyer cette réponse, et
‫encore une fois, je
‫vais juste aller chercher certaines de ces réponses déjà faites ici.
‫Donc, les données que nous voulons envoyer s'appellent des statistiques.
‫Et maintenant, tout ce que nous avons à faire est d'ajouter un
‫nouvel itinéraire ici dans nos itinéraires de tournée et encore une
‫fois, je vais éditer ici, tout en haut.
‫Donc routeur. route /gettour,
‫ou en fait juste tour-stats, juste comme ça parce que le
‫get est déjà défini dans la méthode HTTP.
‫Donc pas besoin de le répéter dans le nom.
‫Donc tourController. getTourStats.
‫Donnez-lui un coffre-fort et testons-le maintenant.
‫Je suis donc vraiment excitant de le tester maintenant, en fait de voir
‫si cela fonctionne parce que, encore une fois, c'est vraiment un outil incroyable et
‫vraiment puissant qui vous
‫permet de faire tellement de choses.
‫Donc tour-stats, envoyez-le et
‫ce n'est pas vraiment le résultat
‫que nous attendions, donc c'est juste le pipeline que
‫nous avons défini, mais je sais déjà pourquoi.
‫Nous n'avons donc pas attendu le résultat.
‫Donc, en gros, tout comme
‫une requête normale va retourner un objet agrégé.
‫Donc . find va retourner une requête, et . l'agrégat va
‫retourner un objet agrégé.
‫Et puis seulement quand
‫on l'attend, il revient effectivement avec le résultat.
‫C'est donc aussi pourquoi nous avons défini cette fonction ici comme
‫une fonction asynchrone, afin que nous puissions ensuite utiliser wait
‫là-dedans et c'est donc le bon endroit.
‫Essayons à nouveau.
‫Et c'est reparti!
‫Tellement bon!
‫Nous avons la note moyenne de tous nos circuits, nous avons
‫le prix moyen que
‫vous voyez est de 1563 et puis le minimum et le maximum, non ?
‫Et à partir de nos données, nous pouvons
‫effectivement confirmer que cela est vrai.
‫Tellement bon!
‫Vraiment, vraiment super.
‫Maintenant, une autre chose que je
‫veux faire ici est de calculer le
‫nombre total d'évaluations que nous avons ainsi que le nombre total de tournées.
‫Nous avons
‫donc la note moyenne
‫ici et faisons-le avant, donc numRatings, comme
‫celui-ci et vous pouvez probablement
‫deviner que celui-ci s'appelle somme, puis notesAverage, ou en
‫fait pas notesAverage, mais notesQuantity, n'est-ce pas ?
‫C'est donc là que le nombre d'évaluations est
‫stocké et donc le nombre d'évaluations, le total, sera
‫la somme de tout cela ensemble.
‫Et maintenant, le dernier, c'est le nombre de tournées
‫et celle-là est un peu plus
‫compliquée, et c'est donc une bonne chose à vous montrer ici.
‫Donc, nous voulons toujours additionner, donc tout additionner, en
‫gros, donc nous utilisons toujours la somme,
‫mais qu'allons-nous additionner ?
‫Eh bien, en gros, nous en ajoutons un pour chaque
‫document, et nous disons donc 1, et c'est tout.
‫Donc, fondamentalement, pour chacun des
‫documents qui passeront par ce pipeline,
‫un sera ajouté à ce compteur numérique.
‫Appelons cela numTours.
‫Et donc, oui, testons-le maintenant, encore une fois.
‫Et effectivement, nous avons nos neuf tournées et nous savons
‫déjà que nous en avons neuf.
‫Ce sont donc toutes les statistiques pour toutes les tournées ensemble, mais
‫passons maintenant au niveau supérieur.
‫Comme je l'ai dit précédemment, nous pouvons maintenant regrouper nos résultats
‫pour différents domaines.
‫Et commençons par la difficulté.
‫Et donc c'est assez similaire à la spécification des champs
‫là-bas qui est simplement le signe dollar,
‫puis le nom du champ.
‫Donc $difficulté, donnez-lui un coffre-fort et c'est tout.
‫Envoyez-le ici, et nous avons maintenant toutes
‫les statistiques définies pour chacune de ces trois difficultés.
‫Alors c'est vraiment, vraiment incroyable.
‫C'est donc la partie qui m'épate.
‫C'est absolument fantastique.
‫Je veux dire, vous pouvez commencer à voir toutes
‫sortes de choses, toutes sortes de manipulations
‫de données que vous pouvez faire en utilisant ce pipeline, n'est-ce pas ?
‫Nous pouvons donc vraiment commencer à analyser des choses,
‫par exemple, nous voyons que les circuits les plus faciles
‫sont ceux qui obtiennent les notes les plus
‫mauvaises avec un 4. 6, tandis que les circuits
‫moyens sont ceux qui obtiennent les notes les plus élevées.
‫On voit aussi que les circuits
‫difficiles sont les plus chers avec un
‫prix moyen de 1997, tandis que les plus faciles sont aussi les
‫moins chers avec un prix de 1272, non ?
‫On voit aussi que les
‫circuits les plus faciles sont ceux qu'on
‫a le plus, donc quatre faciles et seulement deux difficiles, non ?
‫Nous pouvons donc utiliser cela,
‫bien sûr, pour obtenir toutes sortes d'informations sur nos données.
‫Commentons celui-ci
‫ici et essayons-en un autre, par exemple,
‫par notes, pourquoi pas, essayons
‫simplement, voyons ce que nous obtenons.
‫Ainsi, par exemple, nous avons deux circuits, donc en gros
‫avec une note de 4. 5, nous avons
‫deux tours avec 4. 7, un tour avec 4. 8, et
‫trois tours avec 4. 9.
‫Oh, et aussi ici, une tournée avec 4. 6, et donc
‫par exemple, une idée que nous pouvons
‫obtenir ici est que les circuits très chers avec
‫ce prix moyen de 1997 obtiennent des notes extrêmement bonnes.
‫Donc toutes sortes de choses, vraiment que nous pouvons faire ici.
‫Débarrassons-nous de celui-ci, rajoutons celui-ci, et nous pouvons
‫maintenant même
‫faire quelques opérations avec celui-ci.
‫Alors juste pour le plaisir, mettons cette difficulté en majuscule.
‫Donc, bien sûr, ça va être un autre objet ici et
‫puis ici devant se trouve l'opérateur.
‫Et donc l'opérateur dans ce cas, s'appelle $toUpper.
‫Alors juste, encore un autre opérateur MongoDB.
‫Alors vérifiez-le, et maintenant il est écrit en majuscule.
‫Super!
‫Nous avons donc ici la phase de groupes qui est assez complète.
‫Essayons donc un autre qui est une étape de tri.
‫Donc un autre objet dans notre tableau pour encore une autre
‫étape et celui-ci s'appelle sort.
‫Alors triez et là-dedans, nous avons besoin d'un autre objet, et celui-ci
‫s'est en quelque sorte auto-complété, je ne sais pas pourquoi,
‫et donc ici, nous pouvons maintenant spécifier
‫par quel champ nous voulons trier cela et utilisons en fait le prix moyen.
‫Et maintenant, dans le tri, nous devons en fait utiliser les noms
‫de champ que nous avons spécifiés ici dans le groupe.
‫Nous ne pouvons plus utiliser les anciens noms car à ce stade,
‫ils ont déjà disparu.
‫Ils n'existent plus.
‫Donc, à ce stade, dans le
‫pipeline d'agrégation, nous avons vraiment déjà ces résultats.
‫Ce sont donc maintenant nos documents essentiellement.
‫Donc, si vous voulez trier par prix moyen, c'est
‫le nom de champ que nous devons utiliser.
‫On peut donc dire le prix moyen
‫et ensuite on peut dire 1 pour l'ascendant.
‫Alors essayons ça.
‫Et oui, en effet.
‫C'est le plus bas et c'est le plus élevé.
‫Super!
‫Alors on a fait plein de trucs.
‫Permettez-moi de vous montrer que nous pouvons également répéter les étapes.
‫Faisons donc un autre match ici et
‫celui-ci est vraiment juste pour
‫vous montrer que nous pouvons réellement répéter
‫les étapes et je veux aussi vous montrer un autre opérateur.
‫Alors sélectionnons maintenant par identifiant et rappelons-nous que l'identifiant est maintenant
‫la difficulté, n'est-ce pas ?
‫Nous venons donc de le préciser ici.
‫Nous voulons donc l'identifiant et maintenant un nouvel opérateur que nous
‫n'avons pas encore utilisé.
‫Nous voulons que ce ne soit pas égal à, et disons facile.
‫Et donc, comme ça, nous allons
‫sélectionner tous les documents qui ne sont pas faciles.
‫Alors dans ce cas,
‫celui qui dit moyen et difficile, non ?
‫Donc en gros, à l'exception de celui qui dit facile, non ?
‫Encore une fois, ce
‫n'est pas vraiment utile ici car cela enlèvera beaucoup de nos données significatives, mais
‫juste pour vous montrer que nous pouvons
‫bien sûr faire correspondre plusieurs fois.
‫Donc, dans ce cas, nous avons fait correspondre une fois avant
‫de faire le groupe, puis nous avons fait correspondre une fois que nous étions
‫prêts, en faisant le regroupement.
‫Maintenant, gardons cela ici, hors de
‫notre pipeline d'agrégation, mais je vais
‫le laisser ici, juste pour que vous
‫le gardiez comme référence.
‫Donnez-lui une autre sauvegarde, réessayez, et voici donc
‫nos résultats pour obtenir nos
‫statistiques de tournée.
‫Donc, vraiment sympa, vraiment super.
‫J'espère que vous avez apprécié
‫cette vidéo et dans la suivante, nous
‫allons continuer à utiliser le pipeline d'agrégation pour faire d'autres calculs.
‫Et pour vous montrer d'autres étapes différentes.
‫Alors restez à l'écoute pour celui-là.