‫Kursleiter: Erinnern Sie sich daran, dass
‫wir auf jedem Tourdokument ein Feld für die durchschnittliche Bewertung haben?
‫Bis jetzt enthält dieses Feld keine
‫wirklich aussagekräftigen Daten, oder?
‫Aber lassen Sie uns das
‫nun tatsächlich ändern und in diesem Vortrag Durchschnittsbewertungen berechnen.
‫Das Speichern einer Zusammenfassung eines verwandten Datensatzes
‫im Hauptdatensatz ist also tatsächlich eine sehr beliebte Technik
‫in der Datenmodellierung, die ich noch nicht erwähnt hatte.
‫Und diese Technik kann tatsächlich sehr hilfreich
‫sein, um ständige Abfragen
‫des zugehörigen Datensatzes zu verhindern.
‫In unserer Anwendung ist ein großartiges Beispiel für diese
‫Technik, die durchschnittliche Bewertung und die Anzahl der Bewertungen
‫für jede Tour zu speichern, damit wir die Bewertungen nicht jedes
‫Mal abfragen und diesen Durchschnitt berechnen müssen, wenn
‫wir für alle Touren abfragen. okay.
‫Das könnte zum Beispiel für
‫eine Tourübersichtsseite in unserem Frontend sehr nützlich sein,
‫wo wir wirklich nicht alle Bewertungen anzeigen möchten,
‫aber dennoch eine Zusammenfassung dieser Bewertungen anzeigen möchten,
‫wie zum Beispiel die Anzahl der Bewertungen und der Durchschnitt.
‫Und eigentlich haben wir die Felder dafür schon
‫in unserem Tourenschema.
‫Also gleich hier am Anfang, denke ich.
‫Ja, also haben wir
‫hier den Bewertungsdurchschnitt und die
‫Bewertungsmenge, aber im Moment sind es nur
‫einige Zahlen und natürlich nicht der tatsächliche Durchschnitt
‫und die Anzahl der Bewertungen, weil
‫wir das zu keinem Zeitpunkt wirklich berechnet haben unsere
‫Bewerbung, aber genau das werden wir in diesem Video ändern.
‫Im Moment berechnen wir also die durchschnittliche Bewertung und
‫auch die Anzahl der Bewertungen einer Tour
‫jedes Mal, wenn eine neue Bewertung zu dieser Tour hinzugefügt
‫wird oder wenn eine Bewertung aktualisiert oder gelöscht wird, denn das
‫sind genau die Situationen, in
‫denen die Anzahl oder der Durchschnitt könnte sich ändern, richtig.
‫Wie also wollen wir das konkret umsetzen?
‫Hier im Testmodell werden wir eine neue
‫Funktion erstellen, die
‫eine Tour-ID aufnimmt und die
‫durchschnittliche Bewertung und die Anzahl der Bewertungen berechnet,
‫die in unserer Sammlung für diese Tour vorhanden sind.
‫Am Ende aktualisiert die Funktion dann
‫sogar das entsprechende Tourdokument.
‫Um diese Funktion zu verwenden, verwenden
‫wir dann Middleware, um diese Funktion grundsätzlich jedes Mal
‫aufzurufen, wenn es eine neue Überprüfung gibt oder eine
‫aktualisiert oder gelöscht wird, okay.
‫Beginnen wir nun damit, diese Funktion zu schreiben, und
‫dafür werden wir tatsächlich eine statische Methode in unser Schema
‫schreiben, und das ist eine Funktion von Mongoose, die
‫wir noch nicht verwendet haben.
‫Wir haben also nur Instanzmethoden verwendet,
‫die wir für Dokumente aufrufen
‫können und die
‫auch sehr nützlich sind, aber diesmal werden wir wirklich statische Methoden verwenden.
‫Okay.
‫Diese können also wieder direkt am Modell aufgerufen werden,
‫beispielsweise wie dieser Testbericht. calcStats, ok.
‫Und so funktioniert das natürlich mit reviewSchema
‫und dann . Statik und dann den Namen der Funktion.
‫calcAverageRatings ist
‫also gleichbedeutend mit einer Funktion, die sich eine Tour-ID merkt, und
‫diese ID ist natürlich für die
‫Tour, zu der die aktuelle Bewertung gehört.
‫Und ich weiß, dass das jetzt wahrscheinlich alles etwas
‫verwirrend klingt, aber keine Sorge, wenn
‫wir das alles implementiert haben
‫und auch wenn wir
‫es testen, wird es in der Praxis sehr sinnvoll sein, okay?
‫Wie auch immer, um die Berechnung jetzt
‫tatsächlich durchzuführen, verwenden wir wieder die Aggregationspipeline, richtig.
‫Denken wir also daran, dass wir in unserem Tool-Controller genau
‫hier die Aggregationspipeline verwenden, um
‫auch einige Statistiken wie diese zu erstellen, okay.
‫Also haben wir die Aggregatmethode verwendet, die wir direkt am
‫Modell aufgerufen haben, okay.
‫In unserer Instanzmethode können wir jetzt
‫genau dasselbe tun.
‫In einer statischen Methode wie dieser zeigen diese Schlüsselwörter
‫also tatsächlich auf das aktuelle Modell.
‫Deshalb können wir dies verwenden. aggregieren, denn denken Sie
‫daran, dass wir dies nennen müssen. aggregieren direkt auf
‫das Modell, und genau deshalb
‫verwenden wir hier in erster Linie eine statische Methode.
‫Denn auch das zeigt jetzt wieder auf
‫das Modell und wir müssen Aggregat immer auf das Modell nennen, okay.
‫Also müssen wir aggregiert ein Array
‫aller Stufen übergeben, die wir aggregiert haben wollen, okay.
‫Was wollen wir also zuerst tun?
‫Nun, der erste Schritt sollte sein, alle Bewertungen auszuwählen,
‫die tatsächlich zu der aktuellen
‫Tour gehören, die als Argument übergeben wurde.
‫Okay.
‫Unsere erste Etappe ist also eine Match-Phase, denkt daran,
‫und
‫hier haben wir unser Filterobjekt
‫übergeben und können sagen, Tour gleich Tour,
‫aber wir brauchen das nicht wirklich,
‫wie Sie bereits wissen, und entfernen wir dies einfach Teil, oder
‫um es hier mit den Namen etwas
‫weniger verwirrend zu machen, nennen wir diese hier Tour-ID, okay.
‫Also tourId hier rein,
‫okay.
‫Wir wählen also nur
‫eine Tour aus, die wir tatsächlich aktualisieren möchten, okay.
‫Lassen Sie uns nun in der
‫nächsten Phase die Statistiken
‫selbst berechnen, und dafür verwenden wir eine Gruppenphase.
‫Denken Sie in der Gruppenphase daran,
‫dass das erste Feld, das wir angeben müssen, die ID ist, also _id und dann
‫das gemeinsame Feld, das
‫alle Dokumente gemeinsam haben, nach
‫denen wir gruppieren möchten, und das wird wieder
‫die Tour sein.
‫Genau wie in unserem vorherigen statistischen Berechnungsbeispiel haben wir
‫hier nach dem Schwierigkeitsgrad gruppiert.
‫Auf diese Weise berechnen wir die Statistik für leichte
‫und die Statistik für
‫mittlere und dann die Statistik für schwere Touren.
‫In diesem Beispiel haben wir also alle Touren
‫nach ihrer Schwierigkeit gruppiert,
‫okay.
‫Aber hier gruppieren wir natürlich alle Touren
‫nach Tour.
‫Groß.
‫Jetzt die Anzahl der Bewertungen, denken
‫Sie daran, wie
‫wir das machen, also fügen wir im Grunde
‫genommen nur eine für jede Tour hinzu,
‫die wir haben, also jede Tour, die im vorherigen Schritt abgeglichen wurde, okay.
‫Wenn es also fünf Review-Dokumente für die aktuelle
‫Tour gibt, wird für jedes dieser Dokumente eines hinzugefügt.
‫Am Ende werden es also fünf Bewertungen
‫sein, und wieder, weil wir natürlich fünf Review-Dokumente haben.
‫Das macht also Sinn, oder?
‫Dann auch die durchschnittliche Bewertung, die wie zuvor den durchschnittlichen
‫Operator verwendet und dieser in einem Objekt stehen muss und
‫hier
‫der Name des
‫Feldes, das die Bewertung darstellt, richtig.
‫Denken Sie also daran, dass jede Bewertung ein Bewertungsfeld hat.
‫Daraus wollen wir den Durchschnitt berechnen.
‫Okay, und das ist es tatsächlich.
‫Die Anzahl und der Durchschnitt der Bewertungen
‫ist also genau das, was wir in dieser Aggregation berechnen wollten.
‫Denken Sie jetzt daran, dass dies tatsächlich ein
‫Versprechen zurückgibt und wir das also abwarten und dann in
‫einer Variablen namens stats speichern müssen.
‫Okay.
‫Dann markieren Sie diesen hier auch als
‫asynchron, speichern
‫Sie ihn und jetzt müssen wir tatsächlich diese Statistikvariable verwenden.
‫Im Moment möchte ich nur zum
‫Testen die Statistiken tatsächlich in der Konsole protokollieren.
‫Konsole.
‫Log-Statistiken.
‫Okay, dann werden wir im späteren Schritt eigentlich,
‫wie bereits erwähnt, das Tourdokument mit diesen Statistiken
‫aktualisieren wollen, aber das
‫belasse ich etwas später, denn
‫jetzt müssen wir diese Methode
‫eigentlich hier irgendwo aufrufen , da
‫sonst die Statistik hier nie aufgerufen wird.
‫Und denken Sie daran, wie wir
‫am Anfang gesagt haben, dass wir dies jedes Mal
‫mit Middleware tun werden, wenn eine neue Überprüfung erstellt wird.
‫Implementieren wir das also mit reviewSchema pre save und
‫dann
‫einfach mit unserer normalen normalen Middleware-Funktion hier.
‫Und denken Sie daran, dass dieses
‫Schlüsselwort bei dieser Art von Middleware auf
‫das Dokument verweist, das gerade gespeichert wird.
‫Das deutet also auf die
‫aktuelle Bewertung hin, okay.
‫Daher wollen wir die Funktion calcAverageRating
‫damit aufrufen. Tour, richtig.
‫Wie rufen wir diese Funktion nun eigentlich auf?
‫Denken Sie daran, wie
‫ich sagte, dass diese Funktion auf dem Modell verfügbar ist.
‫Also im Grunde genommen wie
‫diese Bewertung. calcAverageRatings und dann
‫wollen wir das wie gesagt nutzen. Tour, ok.
‫Und noch einmal, denn dies ist die
‫aktuelle Bewertung und dies ist dann die Tour-ID, die wir
‫in den calcAverageRatings übergeben werden.
‫Das Problem ist nun, dass an dieser Stelle hier
‫im Code die Review-Variable noch nicht definiert ist.
‫Nun könnte man meinen, dass die einfache Lösung darin
‫besteht, diesen Code nach dieser Review-Deklaration einfach hier einzufügen, aber das wird leider
‫nicht funktionieren, denn genau wie in Express
‫läuft dieser Code hier grundsätzlich in der Reihenfolge ab,
‫in der er deklariert wurde.
‫Wenn wir also diesen Code hier
‫nach der Review-Deklaration einfügen würden, dann würde dieses ReviewSchema hier
‫diese Middleware nicht enthalten, da wir
‫es dann erst deklarieren würden, nachdem
‫das Review-Modell bereits erstellt wurde, okay, aber es gibt glücklicherweise
‫noch einen Weg, dies zu umgehen und das ist,
‫dies zu verwenden. Konstrukteur.
‫Das weist hier also noch auf das Modell hin.
‫Wissen Sie, im Grunde ist dies wiederum das aktuelle Dokument
‫und der Konstruktor ist im Grunde das
‫Modell, das dieses Dokument erstellt hat.
‫Das hier steht also für
‫die Tour und so können wir es dann einfach so machen.
‫Dann wie immer als nächstes anrufen und das wars dann auch schon.
‫Also lassen Sie uns jetzt weitermachen und dies testen.
‫Und dafür werde ich zuerst eine neue Tour erstellen, denn
‫die anderen, die wir bereits haben,
‫haben den Durchschnitt und die
‫Anzahl der Bewertungen bereits berechnet und
‫wir möchten hier wirklich bei Null anfangen, wenn wir das testen.
‫Um eine neue Tour zu erstellen, müssen wir als
‫Administratoren angemeldet sein, und ich denke, das sind wir derzeit, aber um
‫sicherzugehen, machen wir das noch einmal.
‫Okay.
‫Das ist also die neue Testtour.
‫In Ordnung, entfernen wir diese hier, sie sind nicht obligatorisch
‫und ich denke, damit können wir loslegen.
‫In Ordnung, und hier sehen Sie die Standardeinstellungen, die wir
‫zuvor festgelegt haben, also die Bewertungen
‫durchschnittlich für fünf und die Menge auf null gesetzt, okay.
‫Um nun eine neue Bewertung zu erstellen, müssen
‫wir eigentlich als normaler Benutzer angemeldet sein, also
‫nicht als Administrator.
‫Nehmen wir also einen normalen Benutzer, sagen wir.
‫Also lass uns einfach diese Laura hier benutzen.
‫Also Laura@Beispiel. com
‫und wie bereits erwähnt, ist das Passwort immer das gleiche.
‫Also lass uns das machen und jetzt werden wir eine neue Rezension auf Tour erstellen.
‫Also holen wir uns jetzt die Tour, die wir zuvor
‫erstellt haben, also diese ID und fügen sie hier in die URL ein.
‫Okay, und denken Sie daran, dass
‫diese Route jetzt automatisch eine Tour-ID von der
‫URL und eine Benutzer-ID vom derzeit angemeldeten Benutzer erhält,
‫okay.
‫Nehmen wir also diese als erste Bewertung,
‫senden wir sie ab, und jetzt möchte ich einen Blick auf unsere Konsole werfen.
‫Wir haben hier eine Ausgabe, aber aus irgendeinem Grund ist
‫sie nur wie dieses leere Array.
‫Also muss hier etwas nicht funktionieren.
‫Werfen wir also einen Blick auf die Tour-ID hier, um sicherzustellen,
‫dass wir hier den richtigen Wert erhalten, ID und kommentieren wir diesen
‫Teil auch hier aus,
‫um zu sehen, ob in diesem Teil möglicherweise ein Fehler
‫vorliegt, und versuchen wir es jetzt es wieder.
‫Ich füge das gleiche hier einfach nochmal hinzu, okay.
‫Okay, jetzt bekommen wir tatsächlich etwas.
‫Wir haben also diese eine Rezension,
‫die wir ursprünglich erstellt haben.
‫Es beginnt also mit diesem ac15,
‫aber das, was ich gerade erstellt habe, ist dieses 66d, okay.
‫Schauen wir uns das hier in Compass an.
‫Wir müssen also zur letzten Seite gehen.
‫Okay, und das, was in unserer Konsole auftaucht, ist
‫nur dieses hier, aber nicht das zweite,
‫das wir gerade erstellt haben, okay.
‫Wenn wir jetzt also einen
‫dritten erstellen, sollten wir wahrscheinlich den ersten und den zweiten sehen.
‫Versuchen wir es also.
‫Okay.
‫Schicken Sie dieses und jetzt hier in unserer Ausgabe
‫bekomme ich tatsächlich alle drei von ihnen.
‫Das macht also nicht viel Sinn, aber
‫ich wollte hier auf jeden Fall
‫darauf hinweisen, dass wir nicht
‫pre verwenden sollten, sondern stattdessen die post-save-Middleware verwenden sollten, okay.
‫Und das liegt daran, dass der
‫aktuelle Testbericht beim Pre-Save noch
‫nicht wirklich in der Sammlung ist.
‫Also, wenn wir dieses Match dann hier machen, sollte
‫es dann nicht in der Ausgabe hier
‫erscheinen können, weil es zu
‫diesem Zeitpunkt noch nicht wirklich in der Sammlung gespeichert ist, okay.
‫Also am besten hier posten,
‫denn zu diesem Zeitpunkt sind natürlich schon
‫alle Dokumente in der Datenbank gespeichert und das ist dann
‫ein toller Zeitpunkt um
‫diese Berechnung mit allen Bewertungen tatsächlich schon durchzuführen und das
‫Ergebnis dann auf der Tour zu speichern .
‫Okay, ich bin mir
‫nicht wirklich sicher, warum dieser hier tatsächlich an
‫dieser Stelle aufgetaucht ist, aber versuchen wir es jetzt mit einem anderen.
‫Das ist also der vierte,
‫und jetzt bekommen wir next ist keine Funktion und tatsächlich
‫hat die Post-Middleware, wie ich bereits
‫erwähnt habe, keinen Zugriff auf next
‫und daher können wir sie natürlich nicht aufrufen, nicht
‫verwenden.
‫In Ordnung, und hier haben wir unsere nächste Bewertung,
‫okay.
‫So taucht es jetzt auch hier auf.
‫Wir brauchen das also nicht und können jetzt sicher
‫versuchen, unsere Statistiken hier zu berechnen.
‫Speichern Sie es und löschen wir
‫tatsächlich alle diese Bewertungen.
‫Also möchte ich im Grunde bei Null anfangen, okay.
‫Also
‫sollten alle diese fünf Bewertungen hier gehen
‫und jetzt können wir loslegen.
‫Also lasst uns dieses als erstes erstellen
‫und jetzt lasst uns einen Blick auf unsere Statistiken werfen
‫und los gehts.
‫Dies ist also die aktuelle
‫Tour-ID, dann ist die Anzahl der Bewertungen
‫eins und der Durchschnitt ist natürlich drei.
‫Wenn wir also eine weitere mit der Bewertung von fünf hinzufügen,
‫sollte der Durchschnitt vier betragen und wir
‫sollten die Anzahl der Bewertungen gleich zwei haben.
‫Also lasst uns das versuchen und tatsächlich wie
‫gesagt zwei Bewertungen, durchschnittlich vier.
‫Und nur noch einer, um ganz sicher zu gehen, fügen
‫wir noch einen mit
‫fünf hinzu, und los geht's.
‫Groß.
‫Wir berechnen die Statistiken jetzt also richtig, aber
‫natürlich werden sie noch
‫nicht in das aktuelle Tourdokument übernommen.
‫Wenn wir also in Compass hierher zu der Tour kommen, die
‫wir gerade erstellt haben,
‫ist es wahrscheinlich die letzte hier.
‫Ja, also unsere Testtour hat immer noch diese
‫Standardwerte von 4. 5 und null,
‫okay.
‫Jetzt ist es also an
‫der Zeit, die berechneten Statistiken tatsächlich in dieses Tourdokument
‫zu übertragen, okay.
‫Und das machen wir.
‫Dazu benötigen wir
‫zunächst einmal das Tourmodell, richtig.
‫Also Tour
‫verlangen
‫und los gehts.
‫Was wir also tun müssen, ist im Grunde die
‫aktuelle Tour zu finden und sie dann zu aktualisieren.
‫Also haben wir das schon oft gemacht,
‫findById und update,
‫okay.
‫Und die ID ist natürlich die Tour-ID, die in die
‫Funktion übergeben wurde und dann
‫ein Objekt der Daten, die wir eigentlich aktualisieren wollen.
‫Also holen wir uns diese Feldnamen von hier.
‫So haben wir BewertungenMenge auf
‫der einen Seite.
‫Lassen Sie es uns hier vorerst auf eins zusammenfassen,
‫damit wir keinen Fehler und
‫keine Bewertungen erhalten. Durchschnitt.
‫Nochmals, um Fehler zu vermeiden,
‫denn jetzt möchte ich
‫hierher kommen und mir diese Statistiken ansehen.
‫Sie sehen also, dass sie tatsächlich in einem Array gespeichert sind, okay.
‫Wir müssen also zur ersten Position dieses Arrays gehen, wo
‫sich dieses Objekt befindet.
‫Also Statistik auf Position
‫Null und von dort bekommen wir die Endbewertungseigenschaft,
‫okay.
‫Also dieser hier.
‫Und dann natürlich das gleiche für die durchschnittliche Bewertung.
‫Okay.
‫Und jetzt müssen wir auch darauf warten.
‫Dies gibt also wie immer eine Prämisse zurück und so können wir darauf warten.
‫Nun könnten wir das Ergebnis auch in einer Variablen speichern,
‫aber wir brauchen die Tour nicht wirklich.
‫Alles, was wir tun wollen, ist, es
‫wirklich zu aktualisieren,
‫und deshalb speichern wir den Ergebniswert der Prämisse nirgendwo.
‫Okay.
‫Versuchen wir also einfach, hier eine weitere Bewertung
‫hinzuzufügen, diesmal mit einer schrecklichen.
‫Okay.
‫Werfen wir zunächst einen Blick auf die Statistik.
‫Wir erhalten also natürlich die Bewertung von vier, also die Anzahl der
‫Bewertungen, und den Durchschnitt von 3. 5.
‫Um wirklich zu sehen, ob es funktioniert hat,
‫schauen wir uns jetzt Compass an oder wir können auch
‫den Endpunkt der Tour verwenden oder
‫abrufen, okay.
‫Wir brauchen also die Tour-ID, die wir von
‫hier kopieren können, hier einfügen, und jetzt kommt
‫der Moment und tatsächlich hat es
‫funktioniert, perfekt.
‫Das ist großartig, absolut fantastisch.
‫Nur noch einmal zum Spaß, lassen Sie uns
‫hier eine weitere Rezension hinzufügen.
‫Okay.
‫Aktualisieren Sie dieses, und so erhalten wir jetzt fünf
‫und unser Durchschnitt ist ein wenig gestiegen.
‫Groß.
‫Nehmen wir uns jetzt eine Sekunde Zeit und fassen wir zusammen, was wir hier gemacht haben.
‫Also begannen wir mit der Erstellung einer statischen Methode.
‫Also diese ganze Funktion
‫hier, um im Grunde die Statistik des
‫Durchschnitts und der Anzahl der Bewertungen für die
‫Tour-ID zu erstellen, für die die aktuelle Bewertung erstellt wurde, okay.
‫Und wir haben diese Funktion als statische
‫Methode erstellt, weil wir die Aggregatfunktion im Modell
‫aufrufen mussten.
‫In einer statischen Methode ruft diese Variable also
‫genau eine Methode auf.
‫In diesen Fällen ist es also sehr praktisch.
‫Also haben wir hier unsere Aggregationspipeline aufgebaut, in der
‫wir alle Bewertungen ausgewählt haben, die der
‫aktuellen Tour-ID entsprechen, und dann werden sie berechnet, die
‫Statistiken für alle diese Bewertungen.
‫Danach haben
‫wir die Statistik zur aktuellen Tour gespeichert, okay.
‫Um diese Funktion dann tatsächlich
‫nutzen zu können, rufen wir sie auf, nachdem eine neue Bewertung erstellt wurde, okay.
‫Dafür müssen wir diese verwenden. Konstruktor, weil
‫dies auf das aktuelle Modell verweist.
‫Denken Sie jetzt daran, wie gesagt, dass wir
‫auch die Statistiken aktualisieren möchten, wenn eine Bewertung bearbeitet oder gelöscht
‫wird, da diese Aktionen
‫natürlich auch die Anzahl und den Durchschnitt beeinflussen.
‫Dies ist jedoch etwas komplexer.
‫Da dieses Video also schon ziemlich lange läuft, überlassen
‫wir das eigentlich dem nächsten.