‫Kursleiter: Dies ist also
‫der zweite Teil der Berechnung der Bewertungsstatistik.
‫Diesmal, wenn eine Bewertung aktualisiert oder gelöscht wird.
‫Und dieser Teil ist tatsächlich etwas
‫schwieriger, denn bedenken Sie,
‫dass eine Bewertung mit findByIdAndUpdate
‫oder auch
‫findByIdAndDelete aktualisiert oder gelöscht wird, oder?
‫Für diese haben wir also eigentlich keine
‫Dokumenten-Middleware, sondern nur Abfrage-Middleware, okay.
‫In der Abfrage haben wir also eigentlich
‫keinen direkten Zugriff auf das Dokument, um dann etwas
‫Ähnliches zu tun, okay.
‫Denn denken Sie daran, wir brauchen Zugriff auf
‫die aktuelle Überprüfung, damit wir von dort
‫die Tour-ID extrahieren und dann die Statistiken daraus berechnen können,
‫richtig, aber auch hier haben
‫wir für diese Hooks nur Abfrage-Middleware, okay.
‫Aber lassen Sie mich Ihnen jetzt
‫einen netten Trick zeigen, um diese Einschränkung tatsächlich zu umgehen.
‫Also werden wir eine Pre-Middleware
‫für diese Hooks implementieren, im Grunde für diese Events.
‫Also pre, und dann werde ich wieder einen regulären
‫Ausdruck für einen String verwenden, der mit
‫findOneAnd beginnt und das war's.
‫Und so wird
‫dieser dann für findOneAndUpdate und findOneAndDelete funktionieren,
‫denn denken Sie daran,
‫dass findByIdAndUpdate hinter den Kulissen nur eine
‫Abkürzung für findOneAndUpdate mit der aktuellen ID ist, richtig.
‫Hier müssen wir also tatsächlich
‫die Middleware-Hooks findOneAndDelete und findOneAndUpdate verwenden.
‫Also, Funktion, und es bekommt das nächste Schlüsselwort,
‫weil es Pre-Middleware ist.
‫Denken Sie also daran, dass das Ziel darin
‫besteht, Zugriff auf das aktuelle Überprüfungsdokument zu
‫erhalten, okay, aber hier ist dieses Schlüsselwort die aktuelle Abfrage.
‫Wie wollen wir das nun umgehen?
‫Nun, wir können im Grunde eine Abfrage ausführen,
‫und dann erhalten wir das Dokument,
‫das gerade verarbeitet wird.
‫Dazu können wir findOne verwenden.
‫Und das ist es.
‫Dann müssen wir nur noch auf diese Abfrage warten und
‫sie dann irgendwo speichern.
‫Nennen wir es also r, was zur Überprüfung steht, okay.
‫Speichern Sie es dann als asynchron.
‫Und das ist es.
‫Und um sicherzustellen, dass dies hier
‫funktioniert, loggen wir uns das jetzt einfach in die Konsole ein, okay.
‫Ohne Berechnungen anzustellen, interessiert
‫uns nur,
‫ob dieser nette Trick hier funktioniert.
‫Im Grunde also, der Trick, um das in
‫einer Abfrage-Middleware zu umgehen, haben
‫wir nur Zugriff auf die Abfrage.
‫Wir müssen also wieder auf das
‫Dokument zugreifen und führen diese Abfrage grundsätzlich mit
‫findOne aus.
‫In Ordnung, also aktualisieren wir eine Rezension, und aktualisieren wir die letzte,
‫die wir gemacht haben, in Ordnung, und die Bewertung,
‫jetzt setzen wir
‫sie tatsächlich auf vier.
‫Vorher waren es also
‫fünf und jetzt ändern wir es auf vier.
‫Also hat
‫es das gesendet, und hier ist die Rezension.
‫Nun ist die Bewertung an dieser Stelle
‫natürlich immer noch auf fünf gesetzt, da dieser findOne
‫hier wirklich das Dokument aus der Datenbank holt
‫und zu diesem Zeitpunkt, im Pre, noch keine
‫Änderungen in der Datenbank beibehalten hat, und so waren es
‫vorher fünf, und jetzt
‫werden es immer noch fünf sein.
‫Aber das spielt
‫hier keine Rolle, denn uns interessiert nur diese ID.
‫Eigentlich diese Tour-ID, richtig, denn das ist
‫es, was wir
‫brauchen, um die durchschnittlichen Bewertungen zu berechnen.
‫Okay, und jetzt verwenden wir diese Funktion tatsächlich.
‫Okay, denken wir jetzt darüber
‫nach, denn wenn wir diese calcAverageRatings-Funktion zu diesem Zeitpunkt
‫verwenden würden,
‫würden wir die Statistiken
‫mit den nicht aktualisierten Daten berechnen, okay.
‫Und genau aus diesem Grund mussten wir hier
‫oben auch post und nicht pre verwenden, ok,
‫denn erst nachdem das Dokument bereits in der Datenbank
‫gespeichert ist, macht es
‫dann Sinn, die Bewertungen zu berechnen.
‫Und hier ist es genau dasselbe, mit dem
‫großen Unterschied, dass wir dieses Pre nicht einfach in
‫einen Post umwandeln können.
‫Das können wir also nicht, weil wir zu diesem
‫Zeitpunkt keinen Zugriff mehr auf die Abfrage haben,
‫weil die Abfrage bereits ausgeführt wurde, richtig, und so
‫können wir
‫ohne die Abfrage das Überprüfungsdokument nicht
‫speichern und können dann diese Funktion nicht ausführen.
‫Das ist also wirklich verwirrend, ich verstehe, aber ich habe mich wirklich
‫entschieden, diesen Vortrag auf diese Weise zu erstellen, weil dies
‫wirklich die einzige Lösung für
‫dieses Problem ist und es eine wirklich großartige
‫Übung für Sie ist, diese Hallo-Erfahrung im Grunde zu verstehen.
‫Also, die Lösung dafür ist, jetzt post, also,
‫reviewSchema zu verwenden, dann im Grunde dasselbe,
‫also lasst uns das alles einfach kopieren, unser
‫Leben ein bisschen einfacher machen, das loswerden
‫und das loswerden nächste.
‫Hier müssen wir auch als
‫nächstes anrufen, okay, aber dann machen wir es posten, okay.
‫Und nun also zu
‫diesem Zeitpunkt, also nachdem die Abfrage bereits
‫beendet ist und somit die Überprüfung aktualisiert wurde, ist dies
‫ein perfekter Zeitpunkt, an dem
‫wir diese Funktion dann aufrufen können.
‫Berechnen Sie also durchschnittliche Bewertungen.
‫Aber woher bekommen wir jetzt die Tour-ID?
‫Nun, wir müssen einen Trick anwenden,
‫der im Wesentlichen darin besteht, Daten von der Prä-Middleware an
‫die Post-Middleware zu übergeben.
‫Anstatt dieses Dokument in einer einfachen Variablen zu speichern,
‫speichern wir es hier. R.
‫Im Grunde erstellen wir eine Eigenschaft für diese Variable.
‫Okay, und jetzt haben wir hier immer noch Zugriff darauf.
‫Und so können wir das jetzt sagen. r, die sich erinnern, ist die Überprüfung,
‫und dann . Tour.
‫Das ist also wieder ziemlich verwirrend, aber auch wieder
‫ziemlich lustig, wenn man einmal versteht, wie das
‫wirklich funktioniert, okay.
‫Nun, wir brauchen hier wieder so etwas, um diese
‫Funktion hier tatsächlich aufzurufen, denn denken Sie daran,
‫dass dies tatsächlich eine
‫statische Methode ist und wir sie daher im Modell aufrufen müssen.
‫Wo ist nun dieses Modell in diesem Fall?
‫Nun, es ist dabei. r, was in diesem Fall
‫äquivalent zu diesem
‫hier in dieser Middleware ist. Konstrukteur. calcAverageRatings.
‫Woo, das sieht ziemlich überwältigend aus, oder?
‫Das müssen wir natürlich abwarten, deshalb haben wir das als
‫asynchron deklariert, okay.
‫Auch hier haben wir im Wesentlichen diesen Weg verwendet, um die
‫Daten von der Prä-Middleware an die Post-Middleware zu übergeben,
‫und haben dann hier
‫das Überprüfungsdokument aus dieser Variablen abgerufen.
‫Okay, und das mussten wir auch wieder so machen,
‫weil zu diesem Zeitpunkt hier die Abfrage bereits ausgeführt wurde und
‫wir dies
‫hier nicht tun konnten.
‫Und schreiben wir das mal
‫auf; funktioniert hier NICHT, Abfrage wurde bereits ausgeführt.
‫Großartig, und damit sollten wir eigentlich jetzt
‫bereit sein, dies zu testen.
‫Also lasst uns diesen hier noch
‫einmal aktualisieren und auf eine Bewertung von eins setzen, in Ordnung.
‫Werfen wir nun einen Blick hier, bis Sie sehen, dass die Anzahl der Bewertungen
‫immer noch fünf ist, aber
‫der Durchschnitt ist jetzt nur noch drei, und jetzt
‫ist die Frage, ob das wirklich auch auf
‫der Tour aktualisiert wurde, und ja, das tat
‫es tatsächlich .
‫Also fünf Bewertungen mit einem Durchschnitt von drei.
‫Toll, lassen Sie uns jetzt einen anderen aktualisieren.
‫Dazu holen wir uns also alle unsere Bewertungen,
‫und eigentlich wollen wir nicht alle,
‫sondern nur die letzte.
‫Und hier habe ich immer
‫noch diesen Filter, also sollte ich ihn
‫loswerden, also bekommen
‫wir alle 65 Ergebnisse, also all diese Bewertungen, aber wir wollen nur die letzten,
‫also die, die wir gerade erstellt haben.
‫Also lass uns aktualisieren...
‫Ich bin mir nicht sicher, denn eigentlich sind sie hier nicht in Ordnung.
‫Okay, hier haben wir die neuesten.
‫Lassen Sie mich jetzt diesen hier aktualisieren, sagen wir, vier, nur
‫als letzten Test, und damit sollte der
‫Durchschnitt ein wenig angehoben werden.
‫Und das tat es tatsächlich.
‫Also, 3. 6 jetzt, und natürlich ist die Zahl immer
‫noch fünf, weil Sie keine neue Bewertung hinzugefügt haben.
‫Also beim Update funktioniert es super, testen wir
‫es jetzt auch mal beim Löschen.
‫Also lass uns die gerade
‫aktualisierte Rezension löschen und jetzt sollten wir nur noch
‫vier sein, und tatsächlich sind wir hier.
‫Also jetzt nur noch vier.
‫Und lassen Sie uns alle löschen.
‫Dieser ist also der nächste.
‫Ah, hier sind wir.
‫Dann auch dieses.
‫Jetzt sollten wir
‫also nur noch drei sein, oder
‫eigentlich haben wir nur noch zwei mit einem Durchschnitt von vier.
‫Schauen wir uns also mal an, welches uns noch übrig ist.
‫Also dieser mit drei und dieser mit fünf.
‫Und deshalb haben wir diesen Durchschnitt von vier.
‫Also lasst uns diesen loswerden und jetzt sollte
‫unser Durchschnitt fünf sein, oder?
‫Oder eigentlich drei, weil der einzige, der noch übrig
‫ist, drei hat.
‫Und jetzt der letzte Test, den letzten
‫löschen, nur um zu sehen, was passiert, wenn wir das tun.
‫Und wir erhalten hier einen Fehler.
‫Die Eigenschaft nRating von undefined kann also nicht gelesen werden.
‫Das ist also calcAverageRatings in Zeile 69.
‫Weiß also nicht was das ist.
‫Also, Zeile 69, und so ist es dieses Problem hier.
‫Wir versuchen also, nRating von undefined zu lesen.
‫Statistik Null ist also im Grunde undefiniert.
‫Und das liegt daran, dass, wenn es hier
‫im Grunde kein Dokument gibt, das dieser Abfrage entspricht,
‫wir einfach ein leeres Array zurückgeben.
‫Und genau das haben wir hier unten.
‫Dies ist also das Stats-Array und hat im
‫Moment keine Ergebnisse, okay, also
‫sollten wir diesen Code hier nur dann ausführen,
‫wenn wir tatsächlich etwas im Stats-Array haben.
‫Also machen wir das.
‫Also wenn Statistiken. Länge ist größer
‫als Null, gut, dann tun Sie dies.
‫Und wenn nicht, nun, im Grunde bedeutet dies, dass
‫alle unsere Bewertungen weg sind, nun, dann möchten wir
‫im Grunde zu den Standardeinstellungen zurückkehren.
‫Also werden wir es dann auf die
‫Menge Null und den Durchschnitt von 4 setzen. 5, die sich daran erinnern, ist die Standardeinstellung, wenn überhaupt keine
‫Bewertungen vorhanden sind.
‫Also lasst uns schnell eine neue Rezension erstellen, und
‫es kann diese sein, in Ordnung, also
‫haben wir
‫wieder eine Bewertung und löschen sie jetzt sofort, nur um
‫den Code, den
‫wir gerade geschrieben haben, zu testen, nur um sie hier zu sehen
‫auch, also eine Bewertung, durchschnittlich fünf.
‫Und jetzt, wenn wir es löschen,
‫erhalten wir keinen Fehler mehr.
‫Und auf unserer Tour sind wir
‫wieder bei Null und einem Standardwert von 4. 5.
‫In Ordnung, in Ordnung, in Ordnung, perfekt.
‫Lassen Sie uns hier noch einmal
‫kurz zusammenfassen, was wir gerade getan haben.
‫Um diese Funktion hier auch beim
‫Update und beim Löschen ausführen zu können, müssen wir
‫also tatsächlich die Abfrage-Middleware verwenden, die uns
‫Mongoose für diese Situationen zur Verfügung stellt.
‫Okay, wir haben also keine praktische
‫Dokumenten-Middleware, die für diese Funktionen funktioniert, sondern wir müssen stattdessen
‫die Abfrage-Middleware verwenden,
‫und in dieser haben wir keinen
‫direkten Zugriff auf das aktuelle Dokument.
‫Also müssen wir das
‫umgehen, indem wir hier findOne
‫verwenden und so im Grunde das aktuelle Dokument aus der Datenbank abrufen.
‫Wir speichern es dann in
‫der aktuellen Abfragevariablen, und das war's, und dadurch
‫erhalten wir in der Post-Middleware Zugriff darauf.
‫Und erst in der Post-Middleware berechnen wir dann tatsächlich
‫die Statistiken für Reviews.
‫Und denken Sie daran, dass wir es so machen, denn wenn
‫wir es in dieser
‫Middleware-Funktion richtig gemacht hätten, wären die zugrunde liegenden
‫Daten zu diesem Zeitpunkt nicht aktualisiert worden
‫und die berechneten Statistiken wären daher nicht wirklich aktuell.
‫Und deshalb haben wir hier im Grunde
‫diesen zweistufigen Prozess verwendet.
‫Lassen Sie uns nun diese Konsole loswerden. logge dich hier ein, da wir jetzt fertig sind, und
‫auch von dieser Statistik.
‫So, ich hoffe, es hat Ihnen Spaß gemacht
‫und ist nicht zu überwältigend.
‫Ich habe diese Übung speziell entwickelt, damit wir
‫ein reales Geschäftsproblem lösen können, indem wir
‫alle Werkzeuge verwenden, die uns Mongoose zur Verfügung stellt.
‫Und damit hoffe ich, dass Sie ein bisschen besser gelernt
‫haben, wie Sie mit all diesen verschiedenen Middlewares
‫in verschiedenen Situationen arbeiten können, wann immer es
‫in einer realen Situation erforderlich ist.
‫Also, tolle Arbeit, dass du diesen ziemlich anspruchsvollen
‫Vortrag beendet hast und an diesem Punkt des Kurses immer noch bei mir bist.
‫Es ist wirklich gut für mich, das zu sehen, also bin
‫ich wirklich glücklich darüber.
‫Aber wie auch immer, in diesem Abschnitt kommen noch
‫einige weitere großartige Inhalte, und so gehen wir jetzt gemeinsam
‫weiter zum nächsten Video.