‫Sprecher: Lassen Sie uns nun weiter an unserer API arbeiten.
‫In den nächsten
‫Videos werden wir einige gängige
‫API-Funktionen implementieren, die die Verwendung einer API für
‫alle Benutzer einfacher und angenehmer machen.
‫Und in
‫diesem Vortrag beginnen wir mit dem Filtern.
‫Die erste Funktion, die wir implementieren werden, besteht also
‫darin, dem Benutzer zu ermöglichen, Daten grundsätzlich mithilfe einer
‫Abfragezeichenfolge zu filtern.
‫Lassen Sie mich Ihnen nur sagen, was eine Abfragezeichenfolge mit Postman ist.
‫Also, lass uns all diese Typen schließen.
‫In Ordung.
‫Wo Filterung Sinn machen wird, ist
‫hier auf dieser Get-All-Tours-Route.
‫Denn dieser bekommt, wie
‫der Name schon sagt, alle Touren.
‫Hier möchten wir es dem Benutzer ermöglichen, die Daten zu
‫filtern, sodass er nicht alle Daten
‫erhält, sondern nur die Daten, die dem Filter entsprechen.
‫Auf diese Weise können wir dem Nutzer grundsätzlich eine
‫sehr einfache Abfrage der Daten ermöglichen.
‫Wieder mit der Abfragezeichenfolge.
‫Und die Abfragezeichenfolge sieht ungefähr so aus.
‫Und ich bin sicher, Sie haben es gesehen.
‫Wir beginnen also mit einem
‫Fragezeichen und können dann einfach einige Feldwertpaare angeben.
‫Nehmen wir also
‫an, wir wollten für eine Dauer von fünf
‫und gleichzeitig einen Schwierigkeitsgrad von einfach filtern.
‫So können wir ganz einfach eine Abfragezeichenfolge wie diese erstellen.
‫Es beginnt also wieder mit diesem
‫Fragezeichen, und dann können
‫wir in diesem Format beliebig viele Schlüssel-Wert-Paare angeben.
‫Und jetzt erkennt unsere
‫Postman-Anwendung hier dies tatsächlich und parst
‫diese Zeichenfolge im Grunde hier und legt den
‫Schlüssel und die Werte hier in dieser Registerkarte "Params" ab.
‫Wir könnten also auch hier den Schlüssel und die Werte angeben.
‫Sagen wir also test, setzen Sie es auf 23, und
‫Sie sehen hier, dass
‫es tatsächlich der Abfragezeichenfolge hinzugefügt wurde.
‫Das ist also eine sehr nette Art, wie Postman uns hier hilft.
‫Denn jetzt können wir zum Beispiel,
‫während wir testen, diese ein- und ausschalten und
‫Sie sehen, dass
‫der Abfragestring hier entsprechend reagiert.
‫Wie auch immer, wir brauchen jetzt eine Möglichkeit, auf diese Daten
‫in einer Abfragezeichenfolge in unserer Express-Anwendung zuzugreifen.
‫Aber das ist zum Glück für uns
‫ganz einfach, denn Express hat sich schon darum gekümmert.
‫Das ist also nur eines von vielen
‫vielen Dingen, die Express für uns tut, um die NodeJS-Entwicklung
‫wirklich viel schneller zu machen.
‫Lassen Sie mich es Ihnen hier zeigen, tatsächlich in der Konsole.
‫Diese Daten befinden sich also auf einer Anfrage, was sinnvoll ist,
‫und dann in einem Feld namens query.
‫Die Anfragepunktabfrage sollte uns also ein Objekt
‫liefern, das mit den Daten aus der Abfragezeichenfolge schön
‫formatiert ist.
‫Sparen Sie.
‫Und beachten Sie, wie ich
‫es tatsächlich der Funktion zum Abrufen aller Touren hinzugefügt habe.
‫Wir führen diese Art der Filterung also wieder in der
‫Route durch, auf der wir alle Touren erhalten möchten.
‫Testen wir es jetzt mit genau dieser Abfragezeichenfolge.
‫Habe die Anfrage gesendet.
‫Und zurückkommend, hier haben wir das Objekt.
‫Lassen Sie uns das hier tatsächlich größer machen, damit Sie
‫es sehen können.
‫Das funktioniert nicht wirklich.
‫Manchmal weiß ich, dass manche Leute den
‫unteren Bildschirmrand nicht sehen können.
‫Lass es mich hier einfach nochmal machen.
‫Und so geht's.
‫Wir haben das Objekt, dessen Dauer auf fünf und
‫der Schwierigkeitsgrad auf leicht eingestellt ist.
‫Sie sehen also, dass Express diese
‫Zeichenfolge sehr schön in dieses einfach zu verwendende Objekt geparst hat.
‫Eine Sache, die mir hier aufgefallen ist, ist,
‫dass wir tatsächlich das Protokoll vermissen,
‫das wir hier in der Konsole einfacher hatten.
‫Schauen wir uns an, warum das passiert.
‫Aus irgendeinem Grund haben wir jetzt die Anwendung,
‫bevor wir die Umgebungsvariable tatsächlich lesen.
‫Auf diese Weise erhält die Anwendung keinen Zugriff darauf.
‫Ich dachte, ich hätte das schon mal behoben, aber aus irgendeinem
‫Grund ist es jetzt wieder da.
‫Geben Sie es hier noch einmal ab.
‫Und das werde ich noch einmal versuchen.
‫Jetzt bekommen wir unser Logging zurück.
‫Eine Get-Anfrage an diese URL und dann mit
‫diesen restlichen Daten hier.
‫Wie auch immer, verwenden wir diese
‫Daten nun tatsächlich, um unsere Filterung zu implementieren.
‫Aber bevor wir das tun können, muss ich Ihnen
‫sagen, dass es in Mongoose tatsächlich zwei Möglichkeiten
‫gibt, Datenbankabfragen zu schreiben.
‫Die erste besteht darin, einfach das Filterobjekt zu
‫verwenden, wie wir es im Einführungsabschnitt von MongoDB getan haben.
‫Rechts? Erinnere dich daran?
‫Die zweite Möglichkeit besteht darin, einige spezielle Mongoose-Methoden zu verwenden.
‫Lassen Sie mich Ihnen das nur ganz schnell zeigen.
‫Mit dem Filterobjekt würden wir es so machen.
‫Wir beginnen mit der Suche hier, und dann können
‫wir dort ein Filterobjekt übergeben.
‫Und das habe ich schon vorher erwähnt.
‫Auch hier funktioniert es genauso wie
‫bei einer normalen MongoDB-Abfrage.
‫Wir könnten jetzt sagen, dass die Dauer auf
‫fünf gesetzt wurde.
‫Und dann,
‫Schwierigkeit, stellen Sie es auf leicht.
‫Das ist genau die Abfragezeichenfolge, die wir vorher hatten, und jetzt
‫kodiere ich sie hier hart, nur um
‫Ihnen die zwei verschiedenen Möglichkeiten zum Schreiben von
‫Abfragen in Mongoose zu zeigen.
‫Lassen Sie uns das testen.
‫Sie sehen, wir erhalten jetzt nur zwei Ergebnisse.
‫Geben wir uns hier etwas Raum.
‫In Ordung.
‫Wir sehen die beiden Ergebnisse und tatsächlich
‫haben beide eine
‫Dauer von fünf, also hier und hier, und beide sind einfach.
‫Einfach und leicht.
‫Unser Filter hat also gut funktioniert.
‫Dies ist die erste Möglichkeit, eine Abfrage zu schreiben.
‫Ganz normal, wie wir es schon gewohnt sind, aber
‫es geht auch anders.
‫Das darf ich dir auch zeigen.
‫Auch hier beginnen wir genau auf die gleiche
‫Weise, aber der Unterschied besteht
‫darin, dass wir eine spezielle Mongoose-Methode verketten, um
‫die Abfrage im Wesentlichen ähnlich wie diese zu erstellen, die wir haben.
‫Also sagen
‫wir,
‫wo die
‫Dauer gleich fünf ist.
‫Dann auch, wo die
‫Schwierigkeit, die in
‫Anführungszeichen stehen muss, gleich
‫leicht
‫ist.
‫Diese Abfrage hier wird genau
‫dieselbe sein wie diese, aber wiederum
‫mit speziellen Mongoose-Methoden geschrieben.
‫Und es gibt natürlich noch jede Menge andere Methoden.
‫Anstelle von Gleichen können wir beispielsweise weniger oder gleich oder nur
‫weniger als haben, oder Sie können die Ergebnisse
‫auch sortieren oder die Anzahl der Ergebnisse begrenzen und wirklich
‫alle möglichen Dinge.
‫Bestimmt werden wir einige davon in
‫den nächsten Videos verwenden.
‫Dies mag hier für Sie etwas seltsam
‫aussehen, ist aber in einigen Fällen tatsächlich sehr, sehr nützlich.
‫Nur zum Testen, versuchen Sie es noch einmal.
‫Und tatsächlich erhalten wir dieselben beiden Ergebnisse.
‫Nun, lassen Sie mich das hier auskommentieren.
‫Ich belasse es hier nur als
‫Referenz, denn im Moment werden wir diese Methode hier verwenden.
‫Und wir werden es verwenden,
‫denn tatsächlich haben wir bereits ein Objekt,
‫das so aussieht.
‫Und das ist eine Punktabfrage.
‫Wenn Sie es vergleichen, sieht dieses Objekt
‫mit diesem Objekt, das Sie hier unten
‫sehen, genau so aus wie dieses.
‫Um einen sehr einfachen
‫Filter zu implementieren, müssen wir in diesem Fall nur sagen req dot query.
‫Versuchen wir das noch einmal.
‫Werde das hier los.
‫Und tatsächlich erhalten wir genau die gleichen beiden Ergebnisse.
‫Versuchen wir es jetzt nur mit Schwierigkeitsgrad einfach.
‫Jetzt erhalten wir vier Ergebnisse.
‫Alle haben
‫natürlich den Schwierigkeitsgrad leicht.
‫Unser Filter, unser ganz grundlegender Filter,
‫funktioniert jetzt tatsächlich.
‫Das Problem bei dieser Implementierung
‫ist, dass sie eigentlich viel zu einfach ist.
‫Das liegt daran, dass wir später
‫andere Abfrageparameter haben werden.
‫Sortieren Sie beispielsweise für die Sortierfunktion oder
‫page für die Paginierung.
‫Wir müssen sicherstellen,
‫dass wir diese nicht in unserer Datenbank abfragen.
‫Wenn wir hier
‫zum Beispiel Seite gleich zwei hinzugefügt
‫hätten, würden wir natürlich kein Ergebnis erhalten.
‫Lass mich dir das zeigen.
‫Und tatsächlich erhalten wir kein Ergebnis,
‫da es in dieser Sammlung kein Dokument gibt,
‫bei dem die Seite auf zwei gesetzt ist.
‫Wir möchten diesen Parameter hier oder dieses Feld,
‫page, nur verwenden, um die Paginierung zu implementieren und
‫nicht wirklich in der Datenbank abzufragen.
‫Was wir also
‫tun müssen, ist, diese speziellen Feldnamen grundsätzlich aus
‫unserer Abfragezeichenfolge auszuschließen, bevor wir die Filterung durchführen.
‫Lassen Sie uns nun vorangehen und das implementieren.
‫Was wir tun werden, ist,
‫zunächst eine flache Kopie des Request-Dot-Query-Objekts zu erstellen.
‫Nennen wir es Abfrageobjekt.
‫Hier brauchen wir wirklich eine Hardcopy.
‫Wir können nicht einfach Punktabfrage anfordern, denn wenn Sie
‫dann etwas aus diesem
‫Objekt löschen würden, würden wir es
‫auch aus dem Punktabfrageobjekt req löschen.
‫Und das liegt daran,
‫dass in JavaScript, wenn wir eine Variable auf ein anderes
‫Objekt setzen, diese neue Variable im Grunde nur
‫eine Referenz auf dieses ursprüngliche Objekt ist.
‫Also brauchen wir hier wirklich eine Hardcopy.
‫In JavaScript gibt es dafür nicht wirklich eine
‫eingebaute Methode, aber ein sehr netter Trick, den wir
‫seit ES6 verwenden können, besteht darin, zuerst die Strukturierung zu verwenden, die wir verwenden,
‫indem wir Punkt Punkt Punkt verwenden.
‫Und dann können wir daraus einfach ein
‫neues Objekt erstellen.
‫Genau wie dieser.
‫Diese Strukturierung hier, diese drei
‫Punkte, werden im Grunde alle Felder aus dem Objekt entfernen.
‫Hier mit den geschweiften Klammern
‫erstellen wir einfach ein neues Objekt.
‫Wir haben also ein neues
‫Objekt, das im Grunde alle Schlüssel-Wert-Paare
‫enthält, die in unserem req dot Query-Objekt enthalten waren.
‫Das ist also eine Kopie.
‫Lassen Sie uns nun ein Array
‫aller Felder erstellen, die wir ausschließen möchten.
‫Ich nenne das ausgeschlossene Felder.
‫Und dann wollen wir die Seite ausschließen, also die,
‫die ich Ihnen
‫gerade in Postman erzählt habe.
‫Dann möchten wir auch
‫die Sortierung
‫ausschließen, wir möchten das
‫Limit ausschließen und wir möchten Felder ausschließen.
‫Wir werden alle Funktionen zum
‫Paging, Sortieren, Einschränken und Auswählen nur einiger
‫bestimmter Felder später in den nächsten
‫Videos implementieren.
‫Als nächstes müssen wir
‫grundsätzlich alle diese Felder aus unserem
‫Abfrageobjekt entfernen.
‫Und dazu werden
‫wir diese Felder durchlaufen.
‫Also ausgeschlossene
‫Felder für jeden.
‫Und wir verwenden für
‫jedes, weil wir kein neues Array speichern möchten.
‫Dann können wir für
‫jedes dieser Elemente den Löschoperator verwenden.
‫Und dann wollen wir
‫aus dem Abfrageobjekt das Feld mit
‫dem Namen des Elements löschen,
‫also das aktuelle Element im Array.
‫Auf diese Weise löschen wir zuerst das Seitenfeld, dann
‫die Sortierung, dann das Limit, dann die Felder.
‫Natürlich nur für den Fall, dass es da ist.
‫Wenn zB kein Limitfeld vorhanden ist,
‫wird dieses natürlich nicht gelöscht, da es nicht
‫vorhanden ist.
‫Schauen wir uns nun an, ob das tatsächlich funktioniert.
‫Ich werde req dot
‫query und gleichzeitig unser Abfrageobjekt protokollieren.
‫Geben Sie dies ab.
‫Machen Sie sich jetzt keine Sorgen um unsere Ergebnisse.
‫Ich möchte mir nur unser
‫Abfrageobjekt ansehen, um sicherzustellen, dass diese Logik,
‫die wir hier haben, tatsächlich funktioniert.
‫Fügen wir hier eine Sortierung von eins und ein Limit von 10 hinzu.
‫Diese machen später mehr Sinn.
‫Im Moment füge ich sie
‫nur hinzu, damit ich sie später ausschließen kann.
‫Die Ergebnisse spielen keine Rolle, alles was
‫zählt, ist, dass unsere ursprüngliche Abfrage diese hier ist,
‫und dann hat unser Abfrageobjekt,
‫das wir
‫verwenden werden, nur den Schwierigkeitsgrad einfach.
‫Das liegt daran, dass wir ausgeschlossen, ausgelagert, sortiert und eingeschränkt wurden.
‫Das funktioniert jetzt, also
‫verwenden wir statt req dot query unser query-Objekt.
‫Lassen Sie uns das loswerden und versuchen Sie es erneut.
‫Jetzt sollten wir wieder
‫alle Dokumente abfragen, deren Schwierigkeitsgrad
‫auf "Einfach" eingestellt ist, und all diese anderen Felder ignorieren.
‫Senden Sie das.
‫Und tatsächlich sind wir wieder
‫bei unseren vier Ergebnissen, die wir zuvor hatten.
‫Wir können auch die Dauer aktivieren, und tatsächlich
‫haben wir jetzt zwei Ergebnisse.
‫Erinnere dich daran?
‫Und wenn wir diese
‫ausschalten, nun, dann wird es natürlich genauso funktionieren.
‫Lassen Sie uns diese leere Zeile hier einfach löschen.
‫Und so hat es mit unserem ursprünglichen Abfragestring
‫offensichtlich auch noch funktioniert.
‫Wir haben unsere Filterfunktion so vorbereitet,
‫dass sie Seiten-, Sortier- und Begrenzungsfelder ignoriert.
‫Aber es gibt tatsächlich noch
‫etwas, was wir in unserem Code tun müssen,
‫um diese Funktionen grundsätzlich in zukünftigen Videos implementieren zu können.
‫Kehren wir hier zu unserem Code zurück.
‫Lassen Sie uns nun
‫ein wenig darüber lernen, wie Abfragen in Mongoose tatsächlich funktionieren.
‫Ich glaube, ich habe das
‫schon einmal erwähnt, aber es ist sehr wichtig, noch einmal darüber zu sprechen.
‫Diese find-Methode hier wird eine Abfrage zurückgeben.
‫All dies hier wird eine Abfrage zurückgeben.
‫Und das ist der Grund, warum
‫wir dann andere Methoden wie diese verketten können.
‫Wie zum Beispiel wo, gleich und all diese anderen Methoden, über die
‫ich zuvor mit Ihnen gesprochen habe.
‫Lassen Sie mich Ihnen das in der Dokumentation tatsächlich noch einmal zeigen.
‫Hier haben wir das Abfrageobjekt,
‫und wenn wir die Methode find
‫verwenden, gibt sie ein Objekt zurück, das eine Abfrage ist.
‫Im Query Dot Prototyp
‫haben wir dann alle diese Methoden.
‫Zum Beispiel hier unten haben wir wo, was ich
‫gerade erwähnt habe.
‫Wir haben Sortierung,
‫die später zum Sortieren verwendet wird.
‫Wir haben, mal sehen, wir haben
‫weniger oder weniger als gleich, wir haben mehr.
‫Wir haben...
‫Was haben wir noch verwendet?
‫Wir haben Gleiches verwendet.
‫All dies ist Teil des Abfragepunkt-Prototyps.
‫Was wiederum auf Objekte verweist,
‫die wir mit der Abfrageklasse erstellen.
‫Dies ist wiederum der Grund,
‫warum wir diese Art der Verkettung durchführen können.
‫Jetzt kommt der wichtige Teil.
‫Sobald wir das
‫Ergebnis der Abfrage tatsächlich abwarten, also
‫zum Beispiel wait here oder here verwenden.
‫Sobald wir dieses Wait verwenden,
‫wird die Abfrage ausgeführt und
‫mit den Dokumenten
‫zurückgegeben, die tatsächlich unserer Abfrage entsprechen.
‫Wenn wir es so machen, wie wir es hier
‫haben, gibt es jetzt die Möglichkeit,
‫später Sortierung oder Paginierung oder all diese
‫anderen Funktionen zu implementieren.
‫Stattdessen müssen wir diesen
‫Teil hier in einer Abfrage speichern, dann am
‫Ende, sobald wir alle Methoden auf die erforderliche
‫Abfrage ändern, erst dann am
‫Ende können wir darauf warten Anfrage.
‫Zum Beispiel verwenden wir die Sortiermethode.
‫Wir werden die Methode "predict"
‫verwenden, wir werden die Methode "limit" verwenden, und
‫wir werden wirklich eine Reihe von Methoden
‫verwenden und sie mit dieser Abfrage verketten.
‫Das wäre
‫wiederum unmöglich, wenn wir hier gleich das
‫Ergebnis dieser ersten Abfrage abwarten.
‫Ich hoffe, das war sinnvoll.
‫Wir werden unsere
‫Touren
‫hier unten machen.
‫Und dieser wartet auf die Abfrage.
‫Die Abfrage ist einfach die
‫Abfrage ohne Wartezeit.
‫Nur um es mit diesem Teil hier in
‫Einklang zu bringen,
‫machen wir es so.
‫Nehmen wir an,
‫wir erstellen zuerst die
‫Abfrage und führen dann die Abfrage aus.
‫Das ist nicht richtig.
‫Da wir hier Kommentare
‫erstellen, sagen
‫wir auch "Antwort senden".
‫Nur um unseren Code ein bisschen einfacher zu scannen.
‫Ich hoffe, das
‫hat alles Sinn gemacht, es ist ein
‫recht langes Video geworden, aber
‫es war wichtig, diesen Teil hier abzuschließen, indem
‫ich euch diese Logik hier erkläre, damit wir
‫in den nächsten Videos die Umsetzung dann
‫auch umsetzen können Rest der Funktionen.
‫Denn ohne es
‫würde es nicht funktionieren.