‫Bentornato dopo una lunga conferenza in
‫cui abbiamo cercato documenti del
‫tour entro una
‫certa distanza da un certo punto utilizzando query geospaziali.
‫Ora, in questa lezione, usiamo l'aggregazione geospaziale per calcolare le
‫distanze di tutti
‫i tour da un certo punto.
‫Quindi, proprio come prima, iniziamo effettivamente definendo
‫il percorso in modo da sapere
‫con quali dati lavoreremo.
‫Quindi router. rotta; in questo momento lo
‫chiamerò semplicemente distanze, quindi i dati di cui abbiamo bisogno sono
‫la latitudine e la longitudine
‫del punto in cui
‫si trova attualmente l'utente,
‫quindi nel nostro esempio precedente era LA,
‫quindi consentiamo
‫anche all'utente di nuovo per specificare l'unità.
‫Quindi qui, la funzione del gestore del percorso.
‫Questa
‫volta qui, non abbiamo bisogno del parametro
‫della distanza, come lo
‫avevamo qui, perché non cercheremo un certo raggio.
‫Calcoleremo davvero la distanza da un
‫certo punto a tutti i tour che
‫abbiamo nella nostra collezione.
‫Quindi il gestore è su tourController
‫e si chiamerà getDistances.
‫Non lo abbiamo ancora, quindi creiamolo.
‫CatchAsync, e quindi ovviamente contrassegna anche la funzione come
‫asincrona perché sappiamo già che
‫useremo la pipeline di
‫aggregazione e quindi per il
‫momento utilizzeremo un'attesa.
‫L'inizio di questa funzione è in realtà abbastanza simile a
‫quello di getToursWithin, quindi andiamo avanti e copiamo
‫tutto questo codice.
‫Abbiamo alcune unità simili, quindi dobbiamo anche ottenere la latitudine
‫e la longitudine e
‫dobbiamo anche creare questo errore nel
‫caso in cui non ci sia latitudine o longitudine.
‫Questo qui non si applica,
‫e inoltre non abbiamo la distanza.
‫Quindi ora facciamo il calcolo vero e proprio.
‫Proprio come prima, per fare
‫calcoli usiamo sempre la pipeline di aggregazione.
‫E ricorda, questo è chiamato dal modello stesso.
‫Quindi Tour. aggregato.
‫Quindi aspettiamo questo e salviamolo nella
‫variabile delle distanze.
‫Allora qui, ricorda, siamo passati in un
‫array con tutte le fasi della pipeline di
‫aggregazione che vogliamo definire.
‫Ora per l'aggregazione geospaziale,
‫in realtà c'è solo un singolo stadio,
‫e si chiama geoNear, quindi questo.
‫Ancora una volta, questa è
‫l'unica fase della pipeline di aggregazione geospaziale che esiste effettivamente.
‫Questo deve sempre essere il primo della pipeline.
‫Quindi tieni presente che geoNear
‫deve sempre essere la prima fase.
‫Un'altra cosa molto importante da notare su
‫geoNear è che richiede che almeno
‫uno dei nostri
‫campi contenga un indice geospaziale.
‫In realtà l'abbiamo già
‫fatto prima, quindi diamo un'altra occhiata.
‫La nostra posizione di partenza
‫ha già questo indice geospaziale 2dsphere su di essa.
‫Dato che stiamo usando questo startLocation
‫per calcolare le
‫distanze, beh, allora è perfetto.
‫Se c'è solo un campo
‫con un indice geospaziale, questa fase geoNear qui
‫utilizzerà automaticamente quell'indice per eseguire il calcolo.
‫Ma se si dispone di più campi con indici geospaziali,
‫è necessario utilizzare il parametro keys per
‫definire il campo che
‫si desidera utilizzare per i calcoli.
‫Quindi tienilo a mente,
‫ma ancora una volta, in
‫questo caso abbiamo solo un campo, e quindi automaticamente
‫quel campo startLocation verrà utilizzato per fare questi calcoli.
‫Quindi, cosa dobbiamo passare a geoNear?
‫Bene, per prima cosa dobbiamo specificare la proprietà near,
‫e near è il punto da cui calcolare le distanze.
‫Quindi tutte le distanze verranno calcolate da questo punto
‫che definiamo qui, e quindi tutte le posizioni di partenza.
‫Quindi questo punto vicino qui è
‫ovviamente il punto che passiamo a questa funzione
‫con questa latitudine e longitudine.
‫Ora dobbiamo specificare questo punto qui come geojson, quindi è proprio
‫come lo abbiamo fatto
‫prima, dove dobbiamo specificare il tipo come
‫Punto e quindi specificare la proprietà delle coordinate.
‫E come sempre la prima coordinata qui è la
‫longitudine, e poi la seconda, la latitudine.
‫E moltiplichiamoli entrambi per uno, semplicemente
‫per convertirli in numeri.
‫Quindi questo è il primo campo obbligatorio, vicino, e
‫il secondo è la proprietà del campo distanza.
‫Quindi, distanceField, e quindi questo è il
‫nome del campo che verrà
‫creato e dove verranno memorizzate tutte le distanze calcolate.
‫Quindi chiamiamola semplicemente una distanza.
‫In realtà, è così.
‫Questi sono tutti i campi
‫obbligatori in questa fase di geoNear.
‫E naturalmente, possiamo aggiungere altre fasi qui, e
‫in realtà lo faremo un po' più tardi,
‫ma per ora tutto ciò
‫che voglio fare è vedere davvero i risultati di questo lavoro.
‫Copiamo di nuovo questo risultato qui, inviando così
‫questi risultati, e qui, poi inviamo le distanze, e
‫anche questo non
‫ci serve.
‫Quindi, siamo pronti per iniziare.
‫Tieni presente che a questo punto non abbiamo utilizzato
‫l'unità, ma non preoccuparti.
‫Lo faremo tra un secondo,
‫ma ancora una volta, prima voglio davvero vederlo funzionare.
‫Ricorda che il percorso ora è
‫distanze, quindi copiamo questo qui.
‫In realtà, lo salverò anche,
‫quindi nei tour.
‫Diciamo ottenere tour nel raggio.
‫Questo qui si chiama distanze, e non
‫abbiamo questo e nemmeno questo.
‫Quindi solo le coordinate, e poi di nuovo l'unità.
‫Diamo un'occhiata e ora otterremo questo errore.
‫Ricorda come abbiamo detto che geoNear
‫deve sempre essere la prima fase di una pipeline,
‫ma se ora dai
‫un'occhiata al codice potresti pensare che in realtà la nostra fase geoNear
‫sia attualmente la prima fase della nostra pipeline.
‫Perché proprio qui, sembra davvero che lo sia, giusto?
‫Non c'è niente prima di questo, quindi perché otteniamo
‫questo errore che geoNear non è la prima fase della pipeline?
‫In realtà mi ci è voluto un po' di tempo per capirlo perché ha
‫qualcosa a che fare con un pezzo di codice
‫che abbiamo scritto molto tempo fa.
‫È qui nel modello del
‫tour, e se scendiamo qui, credo.
‫Proprio qui, abbiamo questo middleware di aggregazione e ricordiamo
‫che ciò che ha fatto è stato aggiungere sempre questa fase di
‫corrispondenza qui prima di tutte le altre fasi, e in realtà
‫abbiamo questa console. log
‫qui e quindi puoi effettivamente vedere
‫l'intera pipeline qui sotto.
‫E quindi vedete che prima abbiamo
‫la corrispondenza, e poi la
‫fase geoNear qui, in realtà solo come seconda fase.
‫Quindi in realtà ha senso che otteniamo quell'errore.
‫Ora potremmo andare avanti e cambiare questo
‫middleware qui e dire che se geoNear è
‫il primo operatore nella pipeline, allora semplicemente non farlo qui.
‫Ma è un po' troppo lavoro per questo caso d'uso, quindi
‫tutto ciò che farò è sbarazzarmi di questo middleware.
‫Quindi salvalo e ora proviamo di nuovo.
‫Ora abbiamo i nostri tour, e ora dovrebbe avere
‫quel campo di distanza su di loro.
‫Quindi cerchiamo quello, e infatti qui va.
‫Quindi distanza, e poi questo numero enorme qui.
‫È un numero così
‫grande, perché in realtà è calcolato in
‫metri, quindi questo risultato è in metri,
‫quindi prima di tutto convertiamo questo in chilometri.
‫In seguito lo convertiremo anche in miglia, perché
‫ricorda che abbiamo specificato l'unità in miglia, ma per ora
‫la soluzione più semplice è
‫convertirlo effettivamente in chilometri, perché
‫tutto ciò che
‫dobbiamo fare per farlo è semplicemente dividerlo per 1000.
‫E poi anche quello
‫che voglio fare è ottenere davvero solo le distanze
‫e il nome dei tour.
‫Quindi sbarazzati di tutto il resto che abbiamo qui
‫e concentrati solo sulle distanze stesse.
‫Per questo, come ricorderete,
‫possiamo utilizzare la fase del progetto.
‫Quindi aggiungiamolo qui come seconda fase.
‫Quindi progetto, e quindi sostanzialmente i nomi dei campi
‫che vogliamo mantenere.
‫Quindi questa è la distanza, quindi la impostiamo uno a
‫uno, dicendo che vogliamo mantenerla, e poi anche il
‫nome in modo da sapere effettivamente di quale tour stiamo parlando.
‫Con ciò ci liberiamo di tutti
‫gli altri dati e ora dividiamo sostanzialmente la distanza
‫per 1000 per convertire questi metri in chilometri.
‫In realtà, è molto
‫facile farlo, perché in una fase geoNear possiamo
‫effettivamente specificare la proprietà del moltiplicatore di distanza.
‫Quindi distanceMultiplier, e quindi qui possiamo specificare un numero che verrà
‫poi moltiplicato per tutte le distanze.
‫Qui specifichiamo 0. 001, e quindi è esattamente come
‫dividere per 1000.
‫Quindi testiamo il nostro risultato qui ora.
‫E quel calcolo apparentemente richiede del tempo, ma
‫ora ci siamo.
‫Quindi ora ottieni questo bel risultato qui in chilometri.
‫Come vedi, Sports Lover è il tour più vicino alla
‫località di Los Angeles che abbiamo segnato.
‫Quindi sono solo 64 chilometri di distanza, che
‫dovrebbero essere qualcosa come 40 miglia.
‫Ma ancora una volta, faremo quella conversione in un secondo.
‫Per ora, voglio solo tornare a quella mappa e bussola
‫e vedere se questo ha davvero senso.
‫Quindi siamo ancora qui e abbiamo ancora la
‫nostra mappa delle località di partenza.
‫Ora il
‫problema qui è che in realtà non possiamo davvero fare clic
‫su nessuno di questi punti e vedere cosa sono.
‫Ma disegniamo di nuovo un rapido cerchio qui solo
‫per vedere quali sono i tour più
‫vicini e se corrispondono a quelli nel nostro output.
‫Quindi è un po'
‫qui, credo, quindi includiamo questi cinque tour qui.
‫Quindi i loro nomi sono The Park Camper, Snow Adventurer, Wine
‫Taster, Sports Lover e Star Gazer, e quindi
‫ora che veniamo qui, questi
‫sono in realtà i primi cinque.
‫Amante dello sport, Park
‫Camper, Wine Degustatore, Star Gazer e Snow Adventurer.
‫Quindi quello che è molto vicino è lo Sport Lover, e
‫poi il prossimo è il Park Camper
‫e il Wine Taster.
‫Questo qui sarà il Park Camper,
‫che credo inizi a Las Vegas,
‫quindi ha senso,
‫e poi un terzo è
‫qui, The Wine Taster vicino a San Francisco.
‫Quindi quella distanza di 800 chilometri credo, o
‫cos'era?
‫Sì, 600 chilometri, in effetti ha un senso.
‫Quindi, qualcosa vicino a 400 miglia qui.
‫E parlando di miglia, facciamo questa
‫conversione proprio ora.
‫Facciamo qualcosa di simile a quello che abbiamo fatto prima,
‫quindi test per l'unità.
‫Creiamo una variabile moltiplicatore,
‫di nuovo un operatore ternario qui,
‫quindi se sono miglia, quale dovrebbe essere il nostro moltiplicatore?
‫Bene, cerchiamo semplicemente di
‫cercare su Google cosa è un metro in miglia.
‫Un metro per miglia, e Google di solito
‫ci dà una risposta piuttosto carina, e così è davvero.
‫Quindi, se questo è un metro, tutto ciò che dobbiamo fare
‫è moltiplicare davvero il nostro risultato in metri
‫con questo numero.
‫Quindi copiamolo qui e torniamo indietro, quindi questo dovrebbe essere
‫il nostro moltiplicatore nel caso in
‫cui l'unità sia metri, o in realtà nel caso in cui siano miglia.
‫E nel caso siano metri, beh,
‫allora è quello 0. 001 che abbiamo usato prima.
‫Non lo vogliamo
‫in metri, perché non è davvero un'unità leggibile.
‫Invece lo vogliamo in chilometri.
‫Quindi ora possiamo andare avanti e utilizzare la
‫variabile moltiplicatore qui, salvarlo e provarlo.
‫Quindi dai un'occhiata a ciò che abbiamo qui
‫in chilometri, quindi dal risultato precedente, che è 64.
‫Dovrebbero essere circa 40 miglia, quindi mandiamolo, ed
‫era abbastanza vicino.
‫Quindi 40. Veramente 2 miglia.
‫E quindi questi sono i nostri
‫tour più vicini, e il più lontano è il City Wonderer, che penso inizi a New
‫York o qualcosa del genere, e quindi è a
‫più di 2400 miglia di distanza da L. UN.
‫Se lo impostiamo qui su chilometri, dovrebbe
‫tornare a ottenere il valore che
‫avevamo prima.
‫Torniamo alle miglia perché so
‫che la maggior parte delle persone che guardano questo corso
‫provengono dagli Stati Uniti. S. , e così
‫laggiù usano miglia invece di chilometri.
‫Quindi salviamo anche questo qui nella
‫nostra raccolta per ottenere le distanze dai tour dal punto.
‫Questo è tutto, questo conclude questa lezione,
‫ed è tutto ciò che avevo da mostrarvi sui dati geospaziali.
‫Quindi questo video e l'ultimo dovrebbero
‫averti fornito un'ottima panoramica su
‫come lavorare con i dati geospaziali in MongoDB.
‫E come ho detto prima, ci sono un sacco
‫di possibilità di cose che puoi fare nelle tue applicazioni
‫usando questo tipo di dati.