‫Instructeur : Alors maintenant
‫que vous connaissez les bases
‫de Mongoose en implémentant les quatre
‫opérations correctes, il s'agit maintenant d'améliorer un peu nos données de
‫tournée afin de rendre les tournées plus complètes.
‫Donc, à ce stade, nos documents de tournée ne peuvent avoir qu'un
‫nom, une note et un prix.
‫Mais bien sûr, nous avons besoin de beaucoup
‫plus de données ici, car l'objectif est d'avoir une API très riche
‫en données, comme celle-ci.
‫Jetons donc un coup d'œil à la version
‫finale en fait ici comme référence.
‫Et c'est donc celui-ci ici.
‫Et donc nous avons toutes les
‫tournées, et ça va ressembler un peu à ça.
‫D'accord, vous voyez donc que sur chaque
‫tournée, nous avons un lieu de départ, nous avons des notes moyennes,
‫la quantité de notes, des images, des dates de début.
‫Guides, nom, durée, taille maximale du groupe, difficulté,
‫prix, résumé,
‫description, couverture de l'image, emplacements.
‫Même une limace, des critiques, la durée en semaines et l'ID.
‫Vous voyez donc beaucoup de données, et
‫nous n'allons pas ajouter toutes les données de
‫cette conférence ici.
‫Il y a certaines pièces que nous ne pouvons pas
‫encore ajouter, mais nous pouvons bien sûr le rendre un peu plus complet, d'accord ?
‫Et en fait, enregistrons ceci ici, comme référence, et obtenons toutes les
‫visites, et je vais le mettre en
‫dehors de n'importe quel dossier.
‫Alors mettons-le juste ici en haut.
‫Et cela ne fonctionne pas pour une raison quelconque.
‫D'accord, mettons-le ici, alors.
‫Bon, allons-y, c'est
‫correct.
‫Et encore une fois, je le laisse
‫ici, afin de continuer à comparer ce que nous avons
‫avec ce que nous visons.
‫Bref, revenons en arrière et commençons par
‫ce que nous avons déjà, et nous
‫avons le nom.
‫Et donc c'est déjà assez bien,
‫donc pour l'instant je vais laisser ça comme ça.
‫Donc le nom, puis on veut aussi une durée.
‫Et cette durée est un nombre, et elle est requise.
‫Donc, définissez-le sur vrai, et le
‫message est qu'une visite doit avoir une durée.
‫Donc, ces validateurs requis ici sont essentiellement les seuls
‫validateurs que je vais ajouter à
‫chacun de ces champs ici pour le moment.
‫Plus tard, lorsque nous parlerons plus
‫en détail des validateurs, nous en ajouterons beaucoup plus.
‫Mais encore une fois, pour l'instant,
‫je veux juste rendre certains de ces champs, pas tous, obligatoires.
‫Ensuite, nous avons la taille du groupe.
‫Donc, en gros, combien de personnes peuvent
‫au maximum participer à une tournée.
‫Et donc j'appelle celui-ci le maxGroupSize.
‫Et donc cela devrait encore
‫être un nombre, et c'est encore une fois requis.
‫La visite doit avoir une taille de groupe.
‫N'oubliez pas la virgule ici.
‫Ensuite, nous avons également besoin d'une difficulté.
‫Et celle-ci est une chaîne, et plus tard, nous
‫définirons qu'elle doit être moyenne, facile
‫ou difficile, mais encore une fois, c'est
‫en fait un validateur,
‫et je vais laisser cela pour plus tard.
‫Bon, pour l'instant, je dis juste que
‫ça devrait avoir une difficulté.
‫Ensuite, parlons des cotes.
‫Donc maintenant, nous avons un champ appelé Note, mais en
‫fait nous voulons avoir un champ pour
‫la moyenne des notes
‫et un champ pour la quantité des notes.
‫Donc, fondamentalement, le nombre de notes qu'il y a.
‫Ainsi, plus tard, il y aura une autre ressource appelée avis,
‫où les utilisateurs pourront écrire des avis sur
‫les visites et donner des notes.
‫Et ce sera une ressource complètement différente,
‫et un modèle complètement différent.
‫Mais encore, nous voulons avoir fondamentalement un
‫résumé de ces évaluations et de ces critiques ici dans les tournées.
‫D'accord, et vous apprendrez les raisons un peu plus tard
‫une fois que nous aurons commencé comment et pourquoi nous modélisons les données dans les bases
‫de données NoSQL, et en particulier dans MongoDB.
‫D'accord, pour l'instant, ajoutons simplement la moyenne des notes et
‫la quantité des notes.
‫D'accord, nous laissons cela ici comme
‫nombre, et avec
‫cette valeur par défaut, et la quantité d'évaluations, ratingsQuantity.
‫Cela devrait bien sûr aussi être un nombre,
‫et la valeur par défaut sera zéro.
‫Car bien sûr, au début, il
‫n'y aura absolument aucune critique, quand la tournée est nouvelle.
‫Maintenant, je n'ai pas donné à ces deux propriétés
‫ici une valeur requise, car ce n'est pas l'utilisateur
‫qui crée ces
‫visites qui spécifiera réellement ces valeurs, n'est-ce pas ?
‫Donc, lorsque nous
‫créons une nouvelle tournée, nous ne spécifierons
‫jamais les notesAverage, ni les
‫notesQuantity, car cela sera plus tard
‫calculé à partir des vraies critiques, d'accord ?
‫Ensuite, nous avons le prix ici, donc
‫c'est bien comme ça,
‫et nous pourrions aussi avoir une remise.
‫Supposons donc que cette
‫entreprise, donc Natours, souhaite accorder une réduction sur l'un des circuits à
‫un moment donné, et qu'elle puisse
‫donc également spécifier un prix réduit ici.
‫Donc priceDiscount, et donc mettons-le ici au numéro.
‫Nous n'avons pas besoin d'options de type de schéma ici.
‫Par exemple, ce n'est pas obligatoire,
‫et donc pour l'instant, laissons les choses comme ça.
‫Ensuite, nous pouvons spécifier un résumé de la visite.
‫Le résumé est donc de type String.
‫Mais je ne le rendrai pas vraiment obligatoire.
‫D'accord, et c'est simplement parce que ce n'est
‫pas sur la première page de notre site Web.
‫D'accord, donc en gros, ce n'est pas sur la vue d'ensemble.
‫Et je vais vous montrer cela dans une
‫seconde, mais pour l'instant,
‫permettez-moi d'ajouter ici une autre option de type de schéma que je ne vous
‫ai pas encore montrée, qui s'appelle trim.
‫Et la garniture ne fonctionne que pour les cordes.
‫Et je vais le mettre à vrai.
‫Alors rappelez-vous comment j'ai dit qu'il existe différents types de
‫schémas pour différents types ici, et donc
‫pour la chaîne, nous avons un type de schéma qui est
‫trim qui supprimera tous les espaces
‫blancs au début et à la fin de la chaîne.
‫D'accord, et donc si quelqu'un entre,
‫par exemple, cette tournée, bla bla bla, n'a pas d'importance.
‫Donc, si quelqu'un entre ceci, alors
‫tous ces espaces à la
‫fin et au début ici seront coupés.
‫Et effectivement, on peut mettre la même chose sur le
‫nom, par exemple, ici.
‫D'accord, pourquoi pas ?
‫Alors laissons ça comme ça.
‫Ici, je vois que cela s'appelle en fait durée,
‫pas durées.
‫Très bien, c'est donc le résumé, qui est également mal orthographié.
‫Donc résumé comme ça.
‫Oh, et oui, maintenant je voulais vous montrer
‫le site Web de Natours, en fait.
‫Nous revenons donc à notre documentation Mongoose.
‫Mais c'est ce que je veux vous montrer.
‫Donc Natours. dev, qui est l'original de cette application, et
‫donc ce sont les données que nous avons dans notre API, et dont
‫nous avons aussi bien sûr besoin dans la base de données.
‫Nous avons donc toutes ces données.
‫Donc ce nom de tournée, nous avons la difficulté, nous avons la durée,
‫nous avons, c'est un résumé, puis nous avons
‫un lieu de départ, nous avons le nombre de
‫lieux, nous avons une date de
‫début, nous avons la taille
‫maximale du groupe en ici, et nous devons
‫évaluer, la moyenne des notes, la
‫quantité de notes.
‫Nous avons également une image ici.
‫Et puis ici, sur la page des détails, c'est là que
‫nous avons, nous avons le résumé ici.
‫Nous avons les guides que je viens de vous montrer dans Postman auparavant.
‫Nous avons d'autres images.
‫Nous avons ici tous les emplacements, et nous
‫avons tous les avis.
‫D'accord, comme je vous le disais, toutes les données
‫ne sont pas sur la page Aperçu, et donc toutes
‫les données ne sont pas également requises.
‫Bon, revenons ici.
‫Ensuite, je veux ajouter une description.
‫Et il s'agit d'un type de chaîne, et
‫définissons à nouveau trim sur true.
‫Et je viens de me rappeler
‫que le résumé se trouve en fait sur la page Aperçu.
‫Et rendons donc celui-ci obligatoire.
‫Donc vous ajoutez ici
‫à
‫la fin, vrai, une visite doit avoir une description.
‫D'accord, ensuite, nous allons spécifier l'imageCover.
‫Et ce sont donc les images que vous voyez sur
‫la page de présentation et définissons donc celle-ci pour exiger ce rôle.
‫Le type doit donc être chaîne, car en
‫gros, ce sera simplement le nom de l'image
‫ici, que nous pourrons ensuite
‫lire plus tard à partir du système de fichiers.
‫D'accord, donc vraiment juste le nom de l'image.
‫Donc, fondamentalement, une référence sera stockée dans la base de données.
‫Et c'est une pratique très courante, d'accord ?
‫Nous pourrions donc également stocker l'image entière dans une base de données, mais
‫ce n'est généralement pas une bonne idée.
‫Nous laissons simplement les images quelque part dans le système de fichiers, puis mettons
‫le nom de l'image elle-même dans la base de
‫données en tant que champ.
‫Réglez-le donc sur requis, vrai,
‫une visite doit avoir une image de couverture.
‫Bien, le suivant est le reste des images.
‫Et maintenant, ici, nous avons quelque chose de nouveau, d'accord ?
‫Parce que nous avons plusieurs images
‫et que je souhaite enregistrer ces images sous forme de tableau.
‫Et en fait, comme un tableau de chaînes.
‫Et donc la façon de le faire est
‫de simplifier, de spécifier ici un tableau de chaînes, comme ceci.
‫Je veux donc qu'il soit toujours de type chaîne, mais je
‫veux que ce soit un tableau.
‫Donc un tableau dans lequel nous avons un certain nombre de chaînes.
‫Et c'est comme ça que je peux définir ça, d'accord ?
‫Et nous l'utiliserons plus tard pour autre chose.
‫Et donc nous transmettrons en fait
‫plus d'options de type de schéma qu'un simple
‫type, et d'ici là, nous l'utiliserons à nouveau, d'accord ?
‫Pour l'instant, passons à autre chose,
‫et le champ suivant que je voulais
‫ajouter ici est le createdAt.
‫Et le champ createdAt devrait essentiellement être
‫un horodatage défini au moment où l'utilisateur obtient une nouvelle visite.
‫Donc ceci ici devrait bien sûr être ajouté automatiquement.
‫Encore une fois, au moment où la tournée est créée.
‫Alors comment fait-on ?
‫Eh bien, tout d'abord, nous définissons le type sur Date.
‫Donc Data est encore un autre type de données JavaScript intégré, et nous
‫pouvons donc l'utiliser ici.
‫D'accord, le type est donc Date, et nous
‫devons simplement définir une valeur par défaut, et
‫la valeur par défaut
‫est la fonction JavaScript intégrée Date. maintenant.
‫Et je suis sûr que vous connaissez celui-ci.
‫Cela nous donnera donc simplement un horodatage en
‫millisecondes, qui représente essentiellement la milliseconde actuelle.
‫D'accord, maintenant dans
‫Mongo, cela est maintenant immédiatement converti en date
‫d'aujourd'hui afin de mieux comprendre ces données, d'accord ?
‫Alors oui, c'est l'horodatage créé automatiquement.
‫Et maintenant, enfin, nous devons également transmettre un tableau de dates.
‫Et maintenant enfin, pour finir pour
‫le moment, nous voulons également pouvoir définir un tableau de dates de début.
‫Donc startDates, et encore une fois, nous définissons simplement un tableau,
‫puis disons que nous voulons des dates.
‫D'accord, donc ces startDates sont essentiellement des dates différentes
‫auxquelles une tournée commence.
‫Par exemple, nous pouvons avoir une
‫tournée commençant en décembre
‫de cette année, puis en février, l'année
‫suivante, puis une autre en
‫été, et ainsi des dates différentes pour la
‫même tournée sont simplement différentes,
‫disons, des instances de la tournée commençant à des dates différentes.
‫D'accord, j'espère que cela a du sens.
‫Quoi qu'il en soit, celui-ci ici ne sera
‫pas automatiquement créé par MongoDB, et MongoDB essaiera alors automatiquement
‫d'analyser la chaîne que nous avons passée comme date en
‫une vraie date JavaScript.
‫Par exemple, nous pourrions transmettre quelque
‫chose comme disons 2021, le 21 mars, et encore une
‫fois, Mongo analyserait automatiquement cela
‫comme une date.
‫Vous pouvez également spécifier la date.
‫Par exemple, dites 11 et 32 minutes, d'accord.
‫Ou nous pourrions aussi simplement entrer un horodatage Unix, donc
‫un horodatage comme dans ce format ici.
‫D'accord, et donc tous ces
‫formats, en gros, Mongo essaiera de les analyser en une date.
‫Et seulement s'il ne peut pas, il lancera alors une erreur.
‫(expire) C'était donc beaucoup de travail.
‫Faisons une sauvegarde ici.
‫Et la façon dont nous pouvons ensuite essayer cela est
‫d'aller ici à nos données de développement, où
‫nous avons ce tour-simple. json, qui est
‫celui que nous avons utilisé dans une section précédente.
‫D'accord.
‫Et donc tout
‫ce que je vais faire ici est de récupérer
‫toutes ces données ici, puis de les utiliser pour créer une nouvelle demande, d'accord ?
‫Nous voulons donc créer une nouvelle requête POST ici, et
‫avec toutes ces
‫données, au lieu de devoir l'écrire manuellement.
‫D'accord, alors collez tout ça ici.
‫Et maintenant en effet, nous n'avons pas besoin de l'ID.
‫Nous en avions
‫donc besoin avant, lorsque nous faisions notre API basée
‫sur des fichiers, mais c'est fini maintenant, alors débarrassons-nous de cela.
‫Et donc toutes les
‫autres données que nous avons marquées comme étant nécessaires sont maintenant en
‫fait ici, et même plus.
‫Essayons donc de voir ce qui se passe lorsque nous soumettons ceci.
‫Et maintenant, nous recevons des données invalides envoyées.
‫Allons donc à notre contrôleur de tournée, et ici, où nous
‫créons une tournée, au lieu de ce
‫message, retournons en arrière comme nous l'avions
‫auparavant et envoyons l'erreur entière juste pour voir
‫ce qui ne va pas.
‫Alors envoyez-le ici, d'accord, et le problème était que nous
‫avons déjà défini The Snow Adventure.
‫Alors débarrassons-nous d'abord de ça.
‫Oui, nous avons donc
‫ici The Snow Adventure, nous devrions
‫donc supprimer ceci, et pour cela, j'utilise notre propre
‫API, nous pouvons donc déjà l'utiliser ici.
‫Donc celui-là devrait maintenant être
‫parti, et donc maintenant nous devrions pouvoir l'ajouter comme nouvelle tournée.
‫Et en effet, c'est maintenant ici.
‫Voici donc toutes les données que nous venons
‫de préciser dans ce joli format.
‫Donc, ce qui est intéressant maintenant,
‫c'est de voir l'horodatage createdAt.
‫C'est donc l'heure exacte à laquelle j'enregistre cette vidéo.
‫Et donc celui-ci a bien sûr été
‫créé automatiquement par ce bout de code que nous avons quelque part ici.
‫Ouais, ça.
‫Donc cette date vient de cette Date. maintenant l'horodatage
‫que JavaScript analyse ensuite automatiquement
‫jusqu'à cette date agréable et lisible.
‫Ensuite, nous avons ici ces tableaux.
‫D'accord, donc ce tableau et
‫un autre tableau, et bien sûr, l'ID généré automatiquement, d'accord ?
‫Donc, si nous venons ici
‫maintenant, nous avons alors bien sûr trois tournées.
‫D'abord les autres qui ne sont pas si
‫complètes, puis toutes celles-là.
‫Maintenant, ce qui est intéressant à voir ici, c'est
‫que Mongo a également mis à jour le type de tournées que nous avions déjà.
‫Ainsi, par exemple, nous avions une évaluation
‫ici, mais maintenant que notre schéma a complètement
‫changé, il a ensuite ajouté cette moyenne d'évaluation, ainsi
‫que cette quantité d'évaluation, à la fois à leurs valeurs par défaut, et la
‫même en fait ici.
‫Il a également créé cet horodatage.
‫Il a créé, oui, il a créé des images et des dates de
‫début, avec ces tableaux vides.
‫Et donc cela a en quelque sorte changé toutes ces données ici.
‫D'accord, et donc avant de commencer à avancer dans
‫un projet, nous devrions probablement
‫aller de l'avant et supprimer toutes ces données ici.
‫Et en fait, ce que nous allons faire
‫dans la prochaine vidéo, maintenant que notre modèle est enfin
‫terminé, au moins pour
‫cette section, nous allons continuer et écrire
‫un petit script qui importera automatiquement toutes les visites
‫à partir de ces données JSON.
‫D'accord, donc à partir de ce fichier JSON, en fait.
‫Il va donc essentiellement lire le
‫fichier, obtenir toutes les visites et les importer dans la base de données.
‫Très bien, c'est donc ce que nous allons faire ensuite,
‫car cela sera extrêmement utile dans cette
‫section et aussi à l'avenir.