‫Kursleiter: Lassen Sie uns nun einen Prozess
‫namens populate verwenden, um tatsächlich Zugriff auf die
‫referenzierten Tourguides zu erhalten, wenn wir eine bestimmte Tour abfragen.
‫Im letzten Video haben wir
‫also einen Verweis auf den Benutzer erstellt, hier in
‫diesem Guide-Feld, direkt in unserem Tourmodell, oder?
‫Und jetzt werden wir populate verwenden, um
‫die Felder, auf die wir verwiesen haben, durch
‫die eigentlichen zugehörigen Daten zu ersetzen.
‫Und das Ergebnis sieht so
‫aus, als wären die Daten schon immer
‫eingebettet gewesen, obwohl sie sich, wie
‫wir wissen, in einer ganz anderen Sammlung befinden, okay?
‫Der Auffüllprozess findet jetzt immer in einer Abfrage statt.
‫Also gehen wir jetzt zu unserem Tour-Controller
‫und dann direkt zu der Funktion, wo wir eine einzelne Tour erhalten.
‫Also hier, in Get Tour.
‫Und hier ist unsere Anfrage, richtig?
‫Hier bauen wir also unsere Abfrage auf.
‫Und jetzt müssen wir nur noch das
‫Element zur Abfrage hinzufügen.
‫Also auffüllen, und dann den Namen des Feldes,
‫das wir eigentlich ausfüllen
‫wollen und das heißt Hilfslinien, okay?
‫Und wenn man darüber nachdenkt, macht dieser Name tatsächlich Sinn.
‫Wir wollen also im Grunde so füllen,
‫um das Feld namens Hilfslinien in unserem Modell auszufüllen.
‫Richtig, auch dieses Guides-Feld enthält
‫nur die Referenz.
‫und mit populate füllen wir es dann
‫mit den eigentlichen Daten, alles klar und wieder nur in der
‫Abfrage und nicht in der eigentlichen Datenbank, okay?
‫Das ist also wirklich alles, was wir tun müssen.
‫Und jetzt schauen wir uns das Ergebnis an, okay?
‫Das ist also die ID der Tour und denken wir daran, dass
‫die Guides im Moment so aussehen, okay?
‫Aber wenn wir jetzt Tour und mit dieser ID bekommen,
‫dann warten wir jetzt
‫darauf, und tatsächlich, hier sind die Daten zu den Guides.
‫Okay, diese beiden Elemente, die wir bereits in
‫den Anleitungen hatten, wurden jetzt mit den tatsächlichen Daten gefüllt.
‫Und wenn wir uns jetzt alle
‫Touren ansehen, lassen Sie uns hier einiges davon loswerden.
‫Wir haben hier zu viel offen.
‫Also wenn wir jetzt alle Touren bekommen, okay,
‫dann scrollen wir bis zum Ende,
‫wo die neue sein
‫soll und anscheinend ist es jetzt gut, ach
‫das liegt daran, dass ich diesen
‫Filter hier habe, lass uns den loswerden, und jetzt habe ich meine 10 Ergebnisse und
‫tatsächlich ist es hier richtig, also die neue Testtour.
‫Und jetzt sehen Sie, dass es hier wieder darum geht,
‫uns nur die Werte anzuzeigen, die tatsächlich in der Datenbank enthalten sind.
‫Lassen Sie uns das auch hier in Compass bestätigen.
‫Und so haben wir tatsächlich, wie Sie sehen, hier
‫in der Datenbank noch nicht die eigentlichen Daten, sondern nur wirklich die IDs.
‫Okay, und es ist nur dieser Schritt zum Auffüllen, der
‫diese IDs dann durch die tatsächlichen Daten ersetzt, okay?
‫Und genau hier passiert das
‫nicht gut, weil wir das Bevölkern
‫nicht im Routenhandler Get all Tours implementiert haben.
‫Okay, jetzt zeige ich Ihnen nur einen kleinen Trick, den wir
‫mit der Funktion populate machen können.
‫Das heißt eigentlich auch nur die bestimmten Felder auswählen.
‫Wir interessieren uns zum Beispiel hier nicht für diese v-Eigenschaft und auch
‫nicht für passwordChangedAt, also sind das nicht
‫die Daten,
‫die wir über unsere Reiseleiter haben wollen.
‫Und hier in populate können wir das tatsächlich spezifizieren.
‫Anstatt die Zeichenfolge einfach weiterzugeben, können
‫wir ein Optionsobjekt erstellen und dann
‫sagen, der
‫Pfad ist Hilfslinien, also im Grunde der
‫Name des Felds, das wir ersetzen möchten, und dann können wir
‫wie üblich select
‫verwenden , und dann minus, dieses hier und auch
‫das andere, also passwordChangedAt, es ist nur einfacher zu kopieren,
‫in Ordnung, also lass es uns hier ändern
‫und es erneut senden.
‫Und das ist natürlich nicht der richtige Weg, also
‫sorry dafür, ich glaube ich habe ihn auch schon mal benutzt,
‫eigentlich wo ich euch diesen eigentlich
‫zeigen wollte, richtig, und sorry dafür, aber trotzdem was wir
‫loswerden wollen von hier ist dieses V
‫und dieses passwordChangedAt.
‫Und das haben wir
‫auch schon gemacht, also wenn wir es
‫jetzt versenden, dann bekommen wir natürlich nur die Daten, die uns interessieren.
‫In Ordnung, diese Funktion zum Auffüllen ist also
‫ein absolut grundlegendes Werkzeug für die Arbeit
‫mit Daten in Mongoose.
‫Und vor allem natürlich,
‫wenn es Beziehungen zwischen Daten gibt,
‫okay, man sollte also immer genau wissen, wie und wann
‫man sie für eigene Anwendungen nutzen kann.
‫Und um dafür zu trainieren, werden wir
‫es in diesem Abschnitt natürlich noch viele Male verwenden.
‫Ich möchte Sie nur bedenken, dass hinter
‫den Kulissen durch die Verwendung von Auffüllen tatsächlich
‫eine neue Abfrage erstellt
‫wird, was sich auf Ihre Leistung auswirken kann.
‫Okay, natürlich, wenn Sie es nur ein-
‫oder zweimal und in einer Art kleiner Anwendung machen, dann
‫ist der kleine Leistungseinbruch überhaupt keine große Sache.
‫Aber in einer riesigen Anwendung, mit
‫Tonnen von Einwohnern überall, dann
‫könnte das tatsächlich einen Effekt haben, okay?
‫Behalte das also einfach im Hinterkopf.
‫Okay, und es macht wirklich Sinn, denn
‫wie sonst könnte Mongoose gleichzeitig Daten
‫über Touren und Benutzer erhalten.
‫Es muss grundsätzlich eine neue Abfrage erstellt werden,
‫um diese Verbindung herstellen zu können.
‫Okay und jetzt, um das zu beenden, erinnern
‫wir uns daran, was ich
‫Ihnen gezeigt habe, dass dies tatsächlich nicht funktioniert hat, wenn wir alle Touren bekommen.
‫Denken Sie also daran, dass wir in dieser Situation immer
‫noch einfach die IDs der Tourguides und nicht
‫die referenzierten Benutzerdaten erhalten.
‫Okay, und eine Lösung wäre im Grunde, diesen
‫Code hierher zu kopieren, also diese Funktion zum Auffüllen,
‫auch hier in diesen Route-Handler, aber
‫duplizierter Code ist natürlich nie eine gute Idee.
‫Und ich hoffe,
‫dass Sie an dieser Stelle bereits einen besseren Weg kennen, dies zu tun.
‫Und die Antwort darauf ist Abfrage-Middleware.
‫Okay, also gehen wir schnell zu unserem Modell über, und ich kopiere
‫diesen Code jetzt hier
‫und so, ja, lass uns das gleich hier machen.
‫Also,
‫ein pre und dann mache ich es wie zuvor
‫mit einem regulären Ausdruck, der dann für
‫alles funktioniert, was mit find beginnt.
‫Also einfach
‫so, Okay, und natürlich tun wir dies in der
‫Abfrage-Middleware, denn diese Art
‫von Middleware wird bei jeder Abfrage ausgeführt.
‫Richtig, lassen Sie uns einfach all diese Pre-Middlewares
‫zusammenstellen und dann die Post-Middleware.
‫In Ordnung, also lassen Sie mich den Code kopieren, den wir zuvor hatten, und
‫fügen wir ihn jetzt einfach hinzu, denn
‫denken Sie daran, dass dies
‫in der Abfrage-Middleware immer auf die aktuelle Abfrage verweist.
‫Und so füllen nun im Grunde
‫alle Abfragen automatisch das Guides-Feld mit
‫dem referenzierten Benutzer.
‫Okay, und so können wir es jetzt hier loswerden.
‫Und ja, das ist es tatsächlich.
‫Also machen wir es jetzt hier,
‫anstatt es an zwei Stellen im Controller zu tun.
‫Dies ist also ein netter kleiner Trick für den Fall, dass
‫Sie immer alle Ihre Dokumente ausfüllen möchten.
‫Also, lass es uns testen.
‫Erstens, wenn es hier noch funktioniert.
‫Und das tut es tatsächlich, also bekommen wir unsere beiden Benutzer.
‫Und dann testen wir es hier, wo es vorher nicht
‫funktioniert hat und jetzt funktioniert es, also hier ist das Ergebnis davon.
‫Und jetzt, um sicherzustellen, dass es tatsächlich
‫funktioniert, aktualisieren wir es und fügen im Grunde einen weiteren Reiseführer hinzu.
‫Kopieren wir also die ID der Tour hierher und aktualisieren Sie dann die
‫Tour, sodass wir die
‫ID hier einfügen müssen, und dann im Hauptteil von create tour
‫erhalten, also
‫diese Anleitungen und hier einfügen, und
‫dann müssen wir auch unsere holen anderer Benutzer.
‫Also, es ist diese hier, die eigentlich kein Leitfaden oder
‫nicht einmal ein Admin ist, aber dies ist immer noch nur
‫zum Testen, also greifen wir
‫diese ID und legen sie dann hier ab.
‫Also, aktualisieren wir es, das funktioniert immer noch, und jetzt
‫haben wir sogar in
‫dieser Ausgabe bereits die aufgefüllten Daten.
‫Okay, denn in unserem regulären Ausdruck
‫haben wir find verwendet.
‫Und so wird diese Aktualisierung hier mit find by id und
‫update implementiert, und so beginnt sie auch mit
‫find und daher gilt die Query-Middleware, die wir vorher
‫waren, auch für diese Funktion.
‫Okay und so funktioniert das Auffüllen.
‫Okay, also noch einmal, extrem wichtiges Werkzeug
‫in Ihrer Mongoose-Toolbox, in Ordnung.
‫Und nur um sicher zu
‫gehen, nehmen wir uns hier 15 Sekunden Zeit, um es zusammenzufassen.
‫Dies ist also ein zweistufiger Prozess.
‫Zuerst erstellen Sie eine Referenz zu einem anderen Modell.
‫Damit erstellen Sie effektiv
‫die Beziehung zwischen diesen beiden Datensätzen.
‫Dann füllen Sie im zweiten Schritt das
‫Feld aus, das Sie gerade
‫zuvor angegeben haben, sodass die Guides die Methode populate verwenden.
‫In Ordnung, also sehr einfach, sehr unkompliziert, alles, was Sie
‫brauchen, ist die Logik
‫dahinter wirklich zu verstehen und dann
‫sind Sie bereit, es tatsächlich zu benutzen.