‫Willkommen zurück nach einem langen Vortrag,
‫in dem wir mit Geo-Abfragen
‫nach Tourdokumenten in
‫einer bestimmten Entfernung von einem bestimmten Punkt gesucht haben.
‫Lassen Sie uns nun in dieser Vorlesung die räumliche Aggregation verwenden, um
‫Entfernungen zu allen Touren
‫von einem bestimmten Punkt aus zu berechnen.
‫Beginnen wir also wie zuvor mit der
‫Definition der Route, damit wir wissen, mit
‫welchen Daten wir arbeiten werden.
‫Also Router. Route; zu diesem Zeitpunkt nenne
‫ich es einfach Distanzen, und dann sind die Daten, die wir brauchen,
‫der Breiten- und Längengrad des Punktes,
‫an dem sich der
‫Benutzer gerade befindet, also in
‫unserem vorherigen Beispiel war das LA, und dann
‫lassen wir den
‫Benutzer auch erneut, um die Einheit anzugeben.
‫Dann hier die Route-Handler-Funktion.
‫Diesmal
‫brauchen wir hier den Distanzparameter nicht, wie
‫wir ihn hier hatten,
‫weil wir nicht nach einem bestimmten Radius suchen werden.
‫Wir berechnen wirklich die Entfernung von
‫einem bestimmten Punkt zu allen Touren, die
‫wir in unserer Sammlung haben.
‫Der Handler befindet sich also bei
‫tourController und heißt getDistances.
‫Wir haben das noch nicht, also lassen Sie es uns erstellen.
‫CatchAsync, und markieren Sie die Funktion dann natürlich auch als async,
‫da wir bereits wissen, dass wir die
‫Aggregationspipeline verwenden werden, und daher
‫zu der Zeit, in der wir
‫eine Wartezeit verwenden werden.
‫Der Anfang dieser Funktion ist tatsächlich ziemlich ähnlich
‫zu getToursWithin, also kopieren wir einfach
‫den gesamten Code.
‫Wir haben einige ähnliche Einheiten, dann müssen wir auch
‫den Breiten- und Längengrad
‫erhalten, und wir müssen diesen Fehler
‫auch erstellen, falls es keinen Breiten- oder Längengrad gibt.
‫Dieser hier gilt nicht, und
‫wir haben auch nicht den Abstand.
‫Lassen Sie uns nun die eigentliche Berechnung durchführen.
‫Wie zuvor verwenden wir
‫für Berechnungen immer die Aggregationspipeline.
‫Und denken Sie daran, das wird auf dem Modell selbst genannt.
‫Also Tour. Aggregat.
‫Dann warten wir das ab und speichern
‫es in der Abstandsvariablen.
‫Denken Sie daran, dass wir hier ein
‫Array mit allen Stufen der Aggregationspipeline übergeben haben,
‫die wir definieren möchten.
‫Nun, für die Aggregation von
‫Geodaten gibt es eigentlich nur eine einzige Stufe,
‫und die heißt geoNear, also diese hier.
‫Auch hier handelt es sich
‫um die einzige tatsächlich vorhandene Pipeline-Stufe der Geodatenaggregation.
‫Dieser muss immer der erste in der Pipeline sein.
‫Denken Sie also daran, dass
‫geoNear immer die erste Stufe sein muss.
‫Außerdem ist bei geoNear sehr wichtig
‫zu beachten, dass es erfordert,
‫dass mindestens eines
‫unserer Felder einen Geoindex enthält.
‫Eigentlich haben wir das schon früher
‫gemacht, also schauen wir noch einmal rein.
‫Unser Startort hat
‫bereits diesen 2dsphere Geospatial Index.
‫Da wir diese startLocation verwenden, um
‫die Entfernungen zu
‫berechnen, ist das dann perfekt.
‫Wenn es nur ein Feld
‫mit einem Geoindex gibt, verwendet diese geoNear-Stufe hier
‫automatisch diesen Index, um die Berechnung durchzuführen.
‫Wenn Sie jedoch über mehrere Felder mit Geoindizes verfügen,
‫müssen Sie den Parameter keys verwenden, um
‫das Feld zu definieren,
‫das Sie für Berechnungen verwenden möchten.
‫Denken Sie also
‫daran, aber auch in diesem
‫Fall haben wir nur ein Feld, und so
‫wird automatisch dieses startLocation-Feld für diese Berechnungen verwendet.
‫Was müssen wir also an geoNear übergeben?
‫Nun, zuerst müssen wir die Near-Eigenschaft angeben, und Near
‫ist der Punkt, von dem aus die Entfernungen berechnet werden.
‫Von diesem Punkt, den wir hier definieren,
‫werden also alle Entfernungen berechnet und dann alle Startorte.
‫Dieser Nahpunkt hier ist natürlich der
‫Punkt, den wir mit diesem Breiten- und
‫Längengrad in diese Funktion übergehen.
‫Jetzt müssen wir diesen Punkt hier als geojson angeben,
‫also genau wie zuvor,
‫wo wir den Typ als Punkt
‫und dann die Koordinateneigenschaft angeben müssen.
‫Und wie immer ist hier die erste Koordinate der
‫Längengrad und dann die zweite der Breitengrad.
‫Und lassen Sie uns beide mit eins multiplizieren,
‫um es einfach in Zahlen umzuwandeln.
‫Dies ist also das erste Pflichtfeld, near, und
‫das zweite ist die Feldeigenschaft Distance.
‫Also DistanceField, und das ist der Name
‫des Feldes, das erstellt wird
‫und in dem alle berechneten Entfernungen gespeichert werden.
‫Nennen wir das einfach eine Distanz.
‫Eigentlich ist es das.
‫Das sind alle Felder,
‫die in dieser geoNear-Phase obligatorisch sind.
‫Und natürlich können wir hier weitere Phasen hinzufügen,
‫und das werden wir tatsächlich etwas
‫später tun, aber im Moment
‫möchte ich nur die Ergebnisse dieser Arbeit wirklich sehen.
‫Lassen Sie uns dieses Ergebnis hier noch einmal kopieren, also
‫diese Ergebnisse senden, und hier senden wir dann die Entfernungen, und
‫auch dieses, das wir
‫nicht brauchen.
‫Wir sind also startklar.
‫Denken Sie daran, dass wir das Gerät zu diesem Zeitpunkt nicht verwendet haben,
‫aber machen Sie sich darüber keine Sorgen.
‫Wir werden das gleich tun,
‫aber zuerst möchte ich wirklich sehen, wie es funktioniert.
‫Denken Sie daran, dass die Route jetzt Entfernungen ist,
‫also kopieren wir diese hier einfach.
‫Eigentlich werde ich es mir auch
‫sparen, also in die Touren.
‫Nehmen wir an, Touren im Umkreis zu erhalten.
‫Das nennt man hier Distanzen, und das haben
‫wir nicht und das auch nicht.
‫Also nur die Koordinaten und dann wieder die Einheit.
‫Werfen wir einen Blick darauf, und wir werden jetzt diesen Fehler erhalten.
‫Denken Sie daran, wie wir gesagt
‫haben, dass geoNear immer die erste Phase in einer
‫Pipeline sein muss, aber
‫wenn Sie sich jetzt den Code ansehen, denken Sie vielleicht, dass unsere
‫geoNear-Phase derzeit die erste Phase unserer Pipeline ist.
‫Denn genau hier sieht es tatsächlich so aus, oder?
‫Davor gibt es nichts, und warum erhalten wir dann
‫diese Fehlermeldung, dass geoNear nicht die erste Stufe in der Pipeline ist?
‫Eigentlich habe ich etwas Zeit gebraucht, um das herauszufinden, weil dies etwas
‫mit einem Code zu tun hat, den wir
‫vor langer Zeit geschrieben haben.
‫Das ist hier im Tourmodell, und
‫wenn wir hier runter gehen, denke ich.
‫Genau hier haben wir diese Aggregations-Middleware, und
‫denken Sie daran, dass diese Match-Phase hier immer vor
‫allen anderen Stages hinzugefügt wurde, und tatsächlich haben wir
‫diese Konsole. loggen Sie
‫sich hier ein und Sie können tatsächlich die
‫gesamte Pipeline hier unten sehen.
‫Sie sehen also, dass wir hier
‫zuerst das Match und dann
‫die geoNear-Phase haben, eigentlich erst als zweite Stufe.
‫Es macht also tatsächlich Sinn, dass wir diesen Fehler erhalten.
‫Jetzt könnten wir diese Middleware hier ändern
‫und sagen, wenn geoNear der erste Betreiber in
‫der Pipeline ist, dann tun Sie dies hier einfach nicht.
‫Aber das ist ein bisschen zu viel Arbeit für diesen
‫Anwendungsfall, also werde ich nur diese Middleware loswerden.
‫Speichern Sie dies also und versuchen Sie es jetzt erneut.
‫Jetzt bekommen wir unsere Touren, und jetzt
‫sollte dieses Distanzfeld darauf stehen.
‫Also lassen Sie uns danach suchen, und tatsächlich geht es hier los.
‫Also Distanz, und dann diese riesige Zahl hier.
‫Es ist diese große
‫Zahl, weil sie eigentlich in Metern berechnet
‫wird, also kommt dieses Ergebnis in Metern,
‫also lass uns diese zuerst in Kilometer umrechnen.
‫Später werden wir sie dann auch in Meilen umrechnen,
‫denn denken Sie daran, dass wir die Einheit in Meilen
‫angegeben haben, aber im Moment
‫ist die einfachste Lösung, sie tatsächlich
‫in Kilometer umzurechnen,
‫denn dazu müssen wir sie nur durch 1000 teilen.
‫Und dann möchte
‫ich auch nur die Entfernungen und den Namen
‫der Touren wirklich erfahren.
‫Also los mit all dem anderen Durcheinander, das wir hier haben, und
‫konzentriere dich wirklich nur auf die Entfernungen selbst.
‫Dafür können wir, wie
‫Sie sich vielleicht erinnern, die Projektphase nutzen.
‫Also fügen wir das hier als zweite Stufe hinzu.
‫Also projizieren Sie und dann im Grunde die Namen der Felder,
‫die wir behalten möchten.
‫Das ist also die Entfernung, und so setzen wir das eins zu
‫eins, sagen, dass wir es behalten wollen, und dann auch
‫noch den Namen, damit wir wirklich wissen, von welcher Tour wir sprechen.
‫Damit löschen wir alle anderen Daten
‫und teilen nun die Distanz im Wesentlichen durch
‫1000, um diese Meter in Kilometer umzurechnen.
‫Tatsächlich ist dies
‫sehr einfach, da wir in einer
‫geoNear-Stufe tatsächlich die Entfernungsmultiplikatoreigenschaft angeben können.
‫Also distanceMultiplier, und hier können wir eine Zahl angeben, die
‫dann mit allen Distanzen multipliziert wird.
‫Hier geben wir 0 an. 001, und das entspricht genau der
‫Division durch 1000.
‫Testen wir also jetzt unser Ergebnis hier.
‫Und diese Berechnung dauert anscheinend einige Zeit, aber jetzt
‫geht es los.
‫So erhalten Sie jetzt dieses schöne Ergebnis hier in Kilometern.
‫Wie Sie sehen, ist der Sports Lover die nächstgelegene Tour zu
‫dem von uns markierten Ort in Los Angeles.
‫Es sind also nur 64 Kilometer entfernt,
‫das sollten ungefähr 40 Meilen sein.
‫Aber noch einmal, wir werden diese Konvertierung in einer Sekunde durchführen.
‫Im Moment möchte ich nur zu dieser Karte und diesem Kompass
‫zurückkehren und sehen, ob dies tatsächlich Sinn macht.
‫Wir sind also immer noch hier, und wir haben
‫immer noch unsere Karte mit den Startorten.
‫Das Problem
‫dabei ist nun, dass wir keinen dieser Punkte wirklich
‫anklicken und sehen können, was sie sind.
‫Aber lassen Sie uns hier noch einmal einen kurzen Kreis
‫ziehen, um zu sehen, welche Touren am nächsten
‫liegen und ob sie mit denen in unserer Ausgabe übereinstimmen.
‫Es ist also irgendwie hier, glaube
‫ich, und lassen Sie uns diese fünf Touren hier einschließen.
‫Ihre Namen sind also The Park Camper, Snow Adventurer, Wine
‫Taster, Sports Lover und Star Gazer, und wenn
‫wir jetzt hierher kommen,
‫sind dies tatsächlich die ersten fünf.
‫Sportliebhaber, Parkcamper, Weinverkoster,
‫Star Gazer und Snow Adventurer.
‫Ganz in der Nähe ist der Sports Lover, und
‫der nächste ist der Park Camper
‫und der Wine Taster.
‫Dieser hier wird der Park Camper sein,
‫der meiner Meinung nach in Las Vegas
‫beginnt, also macht
‫das Sinn, und dann ist ein dritter
‫hier, The Wine Taster in der Nähe von San Francisco.
‫Also diese Distanz von 800 Kilometern denke ich, oder was
‫war das?
‫Ja, 600 Kilometer, das macht tatsächlich Sinn.
‫Also, etwas in der Nähe von 400 Meilen hier.
‫Und da wir gerade von Meilen sprechen, lassen Sie
‫uns diese Konvertierung jetzt tatsächlich durchführen.
‫Machen wir etwas Ähnliches wie zuvor, also testen
‫wir die Einheit.
‫Lassen Sie uns eine Multiplikatorvariable
‫erstellen, hier wiederum ein ternärer Operator.
‫Wenn es also Meilen sind, wie sollte dann unser Multiplikator sein?
‫Nun, lassen Sie uns
‫eigentlich ganz einfach googeln, was ein Meter in Meilen ist.
‫Ein Meter in Meilen, und Google gibt uns normalerweise
‫eine ziemlich nette Antwort, und das ist es in der Tat.
‫Wenn dies also ein Meter ist, müssen wir nur
‫unser Ergebnis in Metern wirklich mit dieser
‫Zahl multiplizieren.
‫Also kopieren wir es hier und gehen zurück,
‫und das sollte unser
‫Multiplikator sein, falls die Einheit Meter oder tatsächlich Meilen sind.
‫Und falls es Meter sind, dann
‫ist es diese 0. 001, die wir zuvor verwendet haben.
‫Wir wollen es nicht
‫in Metern, weil das keine wirklich lesbare Einheit ist.
‫Stattdessen wollen wir es in Kilometern.
‫Jetzt können wir also die Multiplikatorvariable hier
‫verwenden, sie speichern und es ausprobieren.
‫Schauen Sie sich also an, was wir hier in
‫Kilometern haben, also aus dem vorherigen Ergebnis, das 64 ist.
‫Das sollten ungefähr 40 Meilen sein, also schicken wir das, und
‫das war ziemlich knapp.
‫Also 40. 2 Meilen in der Tat.
‫Und das sind unsere nächsten
‫Touren, und die am weitesten entfernte ist die City Wonderer, die meiner Meinung nach
‫in New York oder so beginnt und mehr
‫als 2400 Meilen von L entfernt ist. A.
‫Wenn wir es dann hier auf Kilometer setzen, dann
‫sollte es wieder den Wert haben, den wir
‫vorher hatten.
‫Lassen Sie es uns auf Meilen
‫zurückführen, denn ich weiß, dass die meisten Leute, die diesen Kurs sehen,
‫aus den USA kommen. S. , und dort
‫werden Meilen anstelle von Kilometern verwendet.
‫Speichern wir dies also auch hier für
‫unsere Sammlung ab, um Entfernungen zu Touren von Punkt zu erhalten.
‫Das ist es, was diesen Vortrag abschließt,
‫und das ist alles, was ich Ihnen über Geodaten zeigen musste.
‫Dieses und das letzte Video sollten Ihnen
‫also einen sehr guten Überblick darüber
‫geben, wie Sie mit Geodaten in MongoDB arbeiten.
‫Und wie ich bereits sagte, gibt es eine Menge
‫Möglichkeiten, die Sie in Ihren eigenen Anwendungen mit dieser
‫Art von Daten tun können.