‫Instructor: Nachdem Sie
‫nun die Grundlagen von Mongoose
‫kennen, indem Sie alle vier korrekten
‫Operationen implementieren, ist es jetzt wichtig, unsere Tourdaten ein wenig besser
‫zu berücksichtigen, um die Touren vollständiger zu machen.
‫Daher können unsere Tourunterlagen an dieser Stelle nur einen Namen, eine
‫Bewertung und einen Preis haben.
‫Aber natürlich brauchen wir hier so viel
‫mehr Daten, denn das Ziel ist es, eine sehr datenreiche API
‫wie diese zu haben.
‫Werfen wir also einen Blick auf die
‫endgültige Version hier als Referenz.
‫Und das ist dieser hier.
‫Und so bekommen wir alle
‫Touren und es wird ein bisschen so aussehen.
‫Okay, Sie sehen also, dass wir
‫auf jeder Tour einen Startort haben, wir haben den Durchschnitt
‫der Bewertungen, die Anzahl der Bewertungen, Bilder, Startdaten.
‫Guides, Name, Dauer, maximale Gruppengröße, Schwierigkeit,
‫Preis,
‫Zusammenfassung, Beschreibung, Bildcover, Orte.
‫Auch eine Schnecke, Bewertungen, Dauer in Wochen und die ID.
‫Sie sehen also viele Daten,
‫und wir werden hier nicht alle Daten in
‫diesem Vortrag hinzufügen.
‫Es gibt einige Teile, die wir noch nicht
‫hinzufügen können, aber wir können es natürlich etwas vollständiger machen, okay?
‫Und lass uns das hier tatsächlich als Referenz speichern und alle
‫Touren abrufen, und ich werde es
‫außerhalb jedes Ordners legen.
‫Also lass es uns einfach hier oben setzen.
‫Und das funktioniert aus irgendeinem Grund nicht.
‫Okay, dann legen wir es einfach hier.
‫Okay, fangen wir an, das ist
‫richtig.
‫Und deshalb belasse ich es hier,
‫um das, was wir haben, immer wieder mit dem
‫zu vergleichen, was wir anstreben.
‫Lassen Sie uns also trotzdem zurückgehen und mit
‫dem beginnen, was wir bereits haben, und wir
‫haben den Namen.
‫Und das ist schon gut
‫genug, also belasse ich es jetzt so.
‫Also der Name, dann wollen wir auch eine Dauer.
‫Und diese Dauer ist eine Zahl, und sie ist erforderlich.
‫Setzen Sie es also auf true, und dann
‫lautet die Meldung, eine Tour muss eine Dauer haben.
‫Diese erforderlichen Validatoren hier sind im Grunde die
‫einzigen Validatoren, die ich vorerst
‫zu jedem dieser Felder hier hinzufügen werde.
‫Später, wenn wir ausführlicher über
‫Validatoren sprechen, werden wir noch viel mehr hinzufügen.
‫Aber auch hier möchte
‫ich vorerst nur einige dieser Felder, nicht alle, erforderlich machen.
‫Als nächstes haben wir die Gruppengröße.
‫Also grundsätzlich, wie viele Personen maximal
‫an einer Tour teilnehmen können.
‫Und so nenne ich das maxGroupSize.
‫Und damit sollte wieder
‫eine Zahl sein, und es ist wieder erforderlich.
‫Die Tour muss eine Gruppengröße haben.
‫Vergiss das Komma hier nicht.
‫Als nächstes brauchen wir auch eine Schwierigkeit.
‫Und dieser ist ein String, und später werden wir
‫definieren, dass er entweder mittel, leicht oder
‫schwierig sein sollte, aber auch das ist
‫eigentlich ein Validator, und
‫ich werde das für eine spätere Zeit belassen.
‫Okay, im Moment sage ich nur,
‫dass es Schwierigkeiten haben sollte.
‫Kommen wir als nächstes zu den Bewertungen.
‫Im Moment haben wir also ein Feld namens Rating,
‫aber in Wirklichkeit möchten wir ein
‫Feld für den Bewertungsdurchschnitt
‫und ein Feld für die Bewertungsmenge haben.
‫Also im Grunde die Anzahl der Bewertungen, die es gibt.
‫Später wird es eine weitere Ressource namens Rezensionen geben,
‫in der Benutzer Rezensionen zu Touren
‫schreiben und Bewertungen abgeben können.
‫Und das wird eine ganz andere Ressource und
‫ein ganz anderes Modell sein.
‫Aber dennoch möchten wir im Grunde eine
‫Zusammenfassung dieser Bewertungen und dieser Bewertungen hier in den Touren haben.
‫In Ordnung, und die Gründe dafür werden Sie
‫etwas später erfahren, sobald wir damit beginnen, wie und warum wir Daten in
‫NoSQL-Datenbanken und speziell in MongoDB modellieren.
‫Okay, jetzt fügen wir einfach den Bewertungsdurchschnitt und
‫die Bewertungsmenge hinzu.
‫Okay, also belassen wir dies
‫hier als Zahl,
‫und mit dieser Vorgabe und der Bewertungsquantität, ratingsQuantity.
‫Das sollte natürlich auch eine Zahl sein,
‫und der Standardwert ist Null.
‫Denn natürlich wird es am
‫Anfang absolut keine Bewertungen geben, wenn die Tour neu ist.
‫Jetzt habe ich diesen beiden Eigenschaften hier
‫keinen erforderlichen Wert gegeben, weil nicht der
‫Benutzer, der
‫diese Touren erstellt, diese Werte tatsächlich vorgibt, oder?
‫Wenn wir also
‫eine neue Tour erstellen, werden wir weder
‫den Durchschnitt der Bewertungen noch
‫die Anzahl der Bewertungen angeben, da dies
‫später aus den echten Bewertungen berechnet wird, okay?
‫Als nächstes haben wir den Preis hier,
‫also ist das in Ordnung,
‫und wir haben möglicherweise auch einen Rabatt.
‫Nehmen wir also
‫an, diese Firma, also Natours, möchte irgendwann auf eine der Touren
‫einen Rabatt geben und kann
‫daher auch hier einen Rabattpreis angeben.
‫Also priceDiscount, und so setzen wir es einfach hier auf Nummer.
‫Wir brauchen hier keine Schematypoptionen.
‫Zum Beispiel ist es nicht
‫erforderlich, also lassen wir es vorerst einfach so.
‫Als nächstes können wir eine Zusammenfassung der Tour angeben.
‫Die Zusammenfassung ist also vom Typ String.
‫Aber ich werde es nicht wirklich erforderlich machen.
‫Okay, und das liegt einfach daran, dass
‫es nicht auf der Titelseite unserer Website steht.
‫Okay, im Grunde ist es nicht in der Übersicht.
‫Und das werde ich Ihnen gleich
‫zeigen, aber lassen Sie
‫mich hier nur eine weitere Schematypoption hinzufügen, die ich Ihnen noch
‫nicht gezeigt habe, nämlich trimmen.
‫Und Trim funktioniert nur für Saiten.
‫Und ich werde es auf true setzen.
‫Denken Sie also daran, wie ich sagte, dass es
‫hier verschiedene Schematypen für verschiedene Typen
‫gibt, und für string haben wir einen Schematyp, der
‫trim ist, der alle Leerzeichen
‫am Anfang und am Ende des Strings entfernt.
‫Okay, und wenn also zum Beispiel
‫jemand an dieser Tour teilnimmt, bla bla, ist es egal.
‫Wenn also jemand dies eingibt, werden
‫all diese Leerzeichen am
‫Ende und am Anfang hier abgeschnitten.
‫Und eigentlich können wir hier zum Beispiel das Gleiche auf
‫den Namen legen.
‫Gut, warum nicht?
‫Also lassen wir es so.
‫Hier sehe ich, dass es eigentlich Dauer heißt,
‫nicht Dauer.
‫Okay, das ist die Zusammenfassung, die auch falsch geschrieben ist.
‫Also eine Zusammenfassung wie diese.
‫Ach ja, jetzt wollte ich euch
‫eigentlich die Natours-Website zeigen.
‫Das ist also zurück zu unserer Mongoose-Dokumentation.
‫Aber das ist es, was ich Ihnen zeigen möchte.
‫Also Natours. dev, das ist das Original dieser Anwendung,
‫und das sind die Daten, die wir in unserer API haben
‫und die wir natürlich auch in der Datenbank benötigen.
‫Wir haben also alle diese Daten.
‫Also dieser Tourname, wir haben den Schwierigkeitsgrad, wir haben die Dauer,
‫wir haben, dies ist eine Zusammenfassung,
‫dann haben wir einen Startort, wir haben die
‫Anzahl der Orte, wir haben
‫ein Startdatum, wir
‫haben die maximale Gruppengröße in hier, und
‫wir müssen den Bewertungsdurchschnitt, die
‫Bewertungsmenge bepreisen.
‫Auch hier haben wir ein Bild.
‫Und dann hier auf der Detailseite haben wir
‫die Zusammenfassung hier unten.
‫Wir haben die Anleitungen, die ich Ihnen gerade in Postman gezeigt habe.
‫Wir haben noch ein paar Bilder.
‫Wir haben hier alle Standorte und wir
‫haben alle Bewertungen.
‫Okay, wie gesagt, nicht alle Daten befinden
‫sich auf der Übersichtsseite und daher sind
‫auch nicht alle Daten erforderlich.
‫Okay, also lass uns hierher zurückkehren.
‫Als nächstes möchte ich eine Beschreibung hinzufügen.
‫Und dies ist eine Art von String, und lassen Sie
‫uns trim wieder auf true setzen.
‫Und ich habe mich gerade daran
‫erinnert, dass sich die Zusammenfassung tatsächlich auf der Übersichtsseite befindet.
‫Und so machen wir dieses erforderlich.
‫Also fügt man hier
‫am
‫Ende hinzu, dass eine Tour eine Beschreibung haben muss.
‫Okay, als nächstes werden wir das imageCover angeben.
‫Und das sind die Bilder, die Sie auf der Übersichtsseite sehen,
‫und lassen Sie uns dieses so einstellen, dass es diese Rolle tatsächlich benötigt.
‫Der Typ sollte also string sein, denn
‫im Grunde ist dies hier einfach der
‫Name des Bildes, das
‫wir dann später aus dem Dateisystem lesen können.
‫Okay, also wirklich nur der Name des Bildes.
‫Grundsätzlich wird also eine Referenz in der Datenbank gespeichert.
‫Und das ist eine sehr gängige Praxis, okay?
‫Wir könnten also auch das gesamte Bild in einer Datenbank speichern, aber
‫das ist normalerweise keine gute Idee.
‫Wir belassen die Bilder einfach irgendwo im Dateisystem und tragen dann
‫den Namen des Bildes selbst als Feld
‫in die Datenbank ein.
‫Stellen Sie es also auf
‫Erforderlich ein. Eine Tour muss ein Titelbild haben.
‫Schön, das nächste ist der Rest der Bilder.
‫Und jetzt haben wir hier etwas Neues, okay?
‫Weil wir mehrere Bilder haben
‫und ich diese Bilder als Array speichern möchte.
‫Und zwar als Array von Strings.
‫Der Weg, dies zu tun, besteht
‫darin, hier einfach ein Array von Strings anzugeben, einfach so.
‫Ich möchte also, dass es immer noch vom Typ string ist, aber
‫ich möchte, dass es ein Array ist.
‫Also ein Array, in dem wir eine Reihe von Strings haben.
‫Und so kann ich das definieren, okay?
‫Und das werden wir später wieder für etwas anderes verwenden.
‫Und so werden wir dann tatsächlich
‫mehr Schematyp-Optionen als nur einen Typ übergeben, und
‫dann werden wir das bis dahin wieder verwenden, in Ordnung?
‫Aber lassen Sie uns vorerst weitermachen,
‫und das nächste Feld, das ich hier
‫hinzufügen wollte, ist das createdAt.
‫Und das Feld createdAt sollte im Grunde ein
‫Zeitstempel sein, der gesetzt wird, wenn der Benutzer eine neue Tour erhält.
‫Also sollte dies hier natürlich automatisch hinzugefügt werden.
‫Auch hier zum Zeitpunkt der Erstellung der Tour.
‫Also, wie machen wir das?
‫Als erstes setzen wir den Typ auf Date.
‫Data ist also ein weiterer in JavaScript integrierter Datentyp, den wir
‫hier verwenden können.
‫Okay, der Typ ist also Date, und
‫dann müssen wir einfach einen Standard festlegen, und
‫der Standard ist die
‫in JavaScript integrierte Funktion Date. jetzt.
‫Und dieses ist Ihnen sicher bekannt.
‫Dadurch erhalten wir einfach einen Zeitstempel in Millisekunden,
‫der im Wesentlichen die aktuelle Millisekunde darstellt.
‫In Ordnung, jetzt
‫in Mongo wird dies jetzt sofort in das heutige
‫Datum umgewandelt, um diese Daten besser zu verstehen, okay?
‫Also ja, das ist der automatisch erstellte Zeitstempel.
‫Und jetzt müssen wir endlich auch noch eine Reihe von Daten eingeben.
‫Und nun zum Schluss,
‫wir wollen auch noch eine Reihe von Startterminen definieren.
‫Also startDates, und wieder definieren wir einfach ein Array und sagen
‫dann, dass wir dort Datumsangaben haben wollen.
‫Okay, diese startDates sind im Grunde unterschiedliche Daten, an
‫denen eine Tour beginnt.
‫Zum Beispiel können wir eine Tour
‫beginnen im Dezember
‫dieses Jahres und dann im Februar,
‫im nächsten Jahr und dann
‫eine weitere im Sommer, und so sind
‫unterschiedliche Daten für dieselbe Tour
‫einfach unterschiedlich, sagen wir, Beispiele der Tour ab verschiedenen Terminen.
‫Okay, ich hoffe das macht Sinn.
‫Wie auch immer, dieser hier wird nicht automatisch
‫von MongoDB erstellt, und MongoDB wird dann automatisch versuchen,
‫den String, den wir als Datum übergeben haben, in ein
‫echtes JavaScript-Datum zu parsen.
‫Zum Beispiel könnten wir so etwas
‫wie sagen wir 2021, den 21. März, übergeben, und
‫Mongo würde dies dann automatisch
‫als Datum analysieren.
‫Sie können auch das Datum angeben.
‫Sagen Sie zum Beispiel 11 und 32 Minuten, in Ordnung.
‫Oder wir könnten auch einfach einen Unix-Zeitstempel eingeben, also
‫einen Zeitstempel wie in diesem Format hier.
‫Okay, und alle diese Formate werden
‫von Mongo im Grunde genommen versuchen, sie in ein Datum zu parsen.
‫Und nur wenn dies nicht möglich ist, wird ein Fehler ausgegeben.
‫(atmet aus) Das war also eine Menge Arbeit.
‫Lassen Sie uns hier sparen.
‫Und der Weg, wie wir das dann ausprobieren können, ist,
‫hier zu unseren Dev-Daten zu gehen, wo wir
‫diese Tour-Simple haben. json-Datei, die
‫wir in einem vorherigen Abschnitt verwendet haben.
‫Gut.
‫Also alles, was
‫ich hier tun werde, ist, all diese Daten
‫hier zu sammeln und diese dann zu verwenden, um eine neue Anfrage zu erstellen, okay?
‫Wir wollen hier also eine neue POST-Anfrage erstellen, und zwar
‫mit all diesen
‫Daten, anstatt sie manuell ausschreiben zu müssen.
‫Okay, also füge das alles hier ein.
‫Und jetzt brauchen wir die ID tatsächlich nicht.
‫Wir brauchten es
‫also früher, als wir unsere dateibasierte API erstellten,
‫aber das ist jetzt vorbei, also lassen Sie uns das los.
‫Und so sind alle
‫restlichen Daten, die wir als erforderlich markiert haben, jetzt tatsächlich hier
‫und sogar noch einige mehr.
‫Versuchen wir also zu sehen, was passiert, wenn wir dies einreichen.
‫Und jetzt bekommen wir ungültige Daten gesendet.
‫Gehen wir also tatsächlich zu unserem Tour-Controller, und hier, wo
‫wir eine Tour erstellen, gehen wir anstelle
‫dieser Nachricht tatsächlich zurück wie zuvor und
‫senden den gesamten Fehler, nur damit wir
‫sehen, was tatsächlich schief läuft.
‫Also schick es hierher, okay, und das Problem war, dass
‫wir The Snow Adventure bereits definiert haben.
‫Also lass uns das erstmal loswerden.
‫Ja, hier haben wir also
‫The Snow Adventure, also sollten wir
‫dies löschen, und dafür verwende ich unsere eigene API,
‫damit wir sie hier bereits verwenden können.
‫Damit sollte jetzt einer weg sein,
‫und so sollten wir jetzt in der Lage sein, dies als neue Tour hinzuzufügen.
‫Und tatsächlich ist es jetzt da.
‫Hier sind also alle Daten, die wir gerade
‫in diesem schönen Format angegeben haben.
‫Was jetzt interessant ist, ist, den
‫Zeitstempel "createdAt" tatsächlich zu sehen.
‫Genau zu diesem Zeitpunkt nehme ich dieses Video auf.
‫Und so wurde dieser natürlich
‫automatisch von diesem Codestück erstellt, das wir hier irgendwo haben.
‫Ja, das.
‫Dieses Datum kommt also von diesem Datum. jetzt einen Zeitstempel,
‫den JavaScript dann automatisch auf
‫dieses schöne und lesbare Datum analysiert.
‫Dann haben wir hier diese Arrays.
‫Okay, also dieses Array und
‫ein weiteres Array und natürlich die automatisch generierte ID, in Ordnung?
‫Wenn wir also jetzt hierher
‫kommen, haben wir dann natürlich drei Touren.
‫Zuerst die anderen, die nicht so vollständig sind,
‫und dann alle diese.
‫Was hier interessant ist, ist, dass
‫Mongo auch die Touren, die wir bereits hatten, aktualisiert hat.
‫Zum Beispiel hatten wir hier
‫eine Bewertung, aber jetzt, da sich unser
‫Schema vollständig geändert hat, hat es diesen
‫Bewertungsdurchschnitt und auch diese Bewertungsmenge hinzugefügt, beide zu ihren Standardeinstellungen, und
‫hier tatsächlich dasselbe.
‫Es hat auch diesen Zeitstempel erstellt.
‫Es hat, ja, es hat Bilder und Startdaten mit diesen
‫leeren Arrays erstellt.
‫Und so hat es all diese Daten hier irgendwie geändert.
‫In Ordnung, und bevor wir mit einem
‫Projekt fortfahren, sollten wir
‫wahrscheinlich alle diese Daten hier löschen.
‫Und tatsächlich, was wir im nächsten
‫Video tun werden, nachdem unser Modell zumindest für
‫diesen Abschnitt endlich
‫fertig ist, werden wir ein
‫kleines Skript schreiben, das automatisch alle Touren
‫aus diesen JSON-Daten importiert.
‫Okay, eigentlich aus dieser JSON-Datei.
‫Es wird also im Grunde
‫die Datei lesen, alle Touren abrufen und in die Datenbank importieren.
‫Okay, das machen wir als nächstes, denn das
‫wird in diesem Abschnitt und auch
‫in Zukunft sehr nützlich sein.