‫Istruttore: Quindi, ora che
‫conosci le basi di Mongoose
‫implementando tutte e quattro le operazioni
‫corrette, è ora di importare un po' meglio i dati dei
‫nostri tour per rendere i tour più completi.
‫Quindi, a questo punto, i nostri documenti di viaggio possono avere solo un
‫nome, una valutazione e un prezzo.
‫Ma ovviamente, abbiamo bisogno di molti
‫più dati qui, perché l'obiettivo è avere un'API ricca di
‫dati, come questa.
‫Quindi diamo un'occhiata alla versione finale
‫in realtà qui come riferimento.
‫E quindi questo è questo qui.
‫E così avremo tutti i
‫tour, e assomiglierà un po' a questo.
‫Ok, quindi vedi che in ogni
‫tour abbiamo una posizione di partenza, abbiamo una media delle
‫valutazioni, una quantità di valutazioni, immagini, date di inizio.
‫Guide, nome, durata, dimensione massima del gruppo, difficoltà,
‫prezzo, riepilogo,
‫descrizione, immagine di copertina, luoghi.
‫Anche una lumaca, recensioni, durata in settimane e ID.
‫Quindi vedete molti dati e
‫non aggiungeremo tutti i dati in questa
‫lezione qui.
‫Ci sono alcuni pezzi che non possiamo
‫ancora aggiungere, ma ovviamente possiamo renderlo un po' più completo, ok?
‫E in realtà salviamo questo qui, come riferimento, e prendiamo
‫tutti i tour, e lo metterò
‫fuori da qualsiasi cartella.
‫Quindi mettiamolo qui in alto.
‫E questo non funziona per qualche motivo.
‫Ok, mettiamolo qui, allora.
‫Ok, andiamo, è
‫corretto.
‫E così di nuovo, lo lascio
‫qui, per continuare a confrontare ciò che abbiamo
‫con ciò a cui miriamo.
‫Comunque, torniamo indietro, e iniziamo con
‫quello che abbiamo già, e abbiamo
‫il nome.
‫E quindi è già abbastanza
‫buono, quindi per ora lo lascerò così.
‫Quindi il nome, poi vogliamo anche una durata.
‫E quella durata è un numero, ed è richiesta.
‫Quindi impostalo su true e quindi il
‫messaggio è che un tour deve avere una durata.
‫Quindi questi validatori obbligatori qui sono fondamentalmente gli
‫unici validatori che aggiungerò a
‫ciascuno di questi campi qui per ora.
‫Più avanti, quando parleremo più
‫in dettaglio dei validatori, aggiungeremo molto di più.
‫Ma ancora una volta, per
‫ora, voglio solo rendere obbligatori alcuni di questi campi, non tutti.
‫Successivamente, abbiamo la dimensione del gruppo.
‫Quindi, in pratica, quante persone possono prendere
‫parte al massimo a un tour.
‫E quindi lo chiamo maxGroupSize.
‫E così quello dovrebbe essere
‫di nuovo un numero, ed è di nuovo richiesto.
‫Il tour deve avere una dimensione di gruppo.
‫Non dimenticare la virgola qui.
‫Successivamente, abbiamo anche bisogno di una difficoltà.
‫E questa è una stringa, e più avanti
‫definiremo che dovrebbe essere media, facile
‫o difficile, ma di nuovo, questo è
‫in realtà un validatore,
‫e lo lascerò per un momento successivo.
‫Ok, per ora sto solo dicendo
‫che dovrebbe avere una difficoltà.
‫Ora parliamo delle valutazioni.
‫Quindi in questo momento abbiamo un campo chiamato Valutazione, ma
‫in realtà vogliamo avere un campo per
‫la media delle valutazioni
‫e un campo per la quantità delle valutazioni.
‫Quindi sostanzialmente la quantità di voti che ci sono.
‫Quindi, in seguito, ci sarà un'altra risorsa chiamata recensioni, in cui
‫gli utenti saranno in grado di scrivere recensioni
‫sui tour e dare valutazioni.
‫E questa sarà una risorsa completamente diversa
‫e un modello completamente diverso.
‫Ma comunque, vogliamo avere sostanzialmente un
‫riassunto di queste valutazioni e di queste recensioni qui nei tour.
‫Va bene, e le ragioni di ciò le
‫imparerai un po' più tardi, quando inizieremo come e perché modelliamo i dati nei
‫database NoSQL, e in particolare in MongoDB.
‫Ok, per ora aggiungiamo solo la media delle valutazioni e
‫la quantità delle valutazioni.
‫Ok, quindi lo lasciamo qui come
‫numero, e con
‫questo valore predefinito e la quantità di valutazioni, ratingQuantity.
‫Ovviamente dovrebbe essere anche un numero e
‫il valore predefinito sarà zero.
‫Perché ovviamente, all'inizio, non
‫ci saranno assolutamente recensioni, quando il tour è nuovo.
‫Ora non ho assegnato a queste due proprietà
‫un valore obbligatorio, perché non è l'utente
‫che crea
‫questi tour che specificherà effettivamente questi valori, giusto?
‫Quindi, quando
‫creiamo un nuovo tour, non specificheremo
‫mai i ratingAverage, né
‫i ratingQuantity, perché in seguito
‫verranno calcolati dalle recensioni reali, ok?
‫Poi abbiamo il prezzo qui, quindi
‫va bene così,
‫e potremmo anche avere uno sconto.
‫Quindi diciamo che questa
‫compagnia, quindi Natours, vuole dare uno sconto a uno dei tour ad
‫un certo punto, e quindi può
‫specificare un prezzo scontato anche qui.
‫Quindi prezzoSconto, e quindi mettiamolo qui al numero.
‫Non abbiamo bisogno di alcuna opzione per il tipo di schema qui.
‫Ad esempio, non è
‫richiesto, quindi per ora lasciamolo così.
‫Successivamente, possiamo specificare un riepilogo del tour.
‫Quindi il sommario è di tipo String.
‫Ma in realtà non lo renderò necessario.
‫Ok, e questo è semplicemente perché non
‫è sulla prima pagina del nostro sito web.
‫Ok, quindi fondamentalmente non è sulla panoramica.
‫E te lo mostrerò tra un secondo,
‫ma per ora lasciami
‫aggiungere qui un'altra opzione del tipo di schema che non ti ho
‫ancora mostrato, che si chiama trim.
‫E il trim funziona solo per le stringhe.
‫E lo imposterò su vero.
‫Quindi ricorda come ho detto che ci sono diversi tipi
‫di schema per diversi tipi qui, e
‫quindi per la stringa, abbiamo un tipo di schema che
‫è trim che rimuoverà tutto
‫lo spazio bianco all'inizio e alla fine della stringa.
‫Ok, quindi se qualcuno entra,
‫per esempio, in questo tour, bla bla bla, non importa.
‫Quindi, se qualcuno entra in questo,
‫allora tutto questo spazio bianco
‫alla fine e all'inizio qui verrà tagliato.
‫E in effetti, possiamo mettere la stessa cosa sul nome,
‫per esempio, qui.
‫Ok, perché no?
‫Quindi lasciamolo così.
‫Qui vedo che in realtà si chiama durata,
‫non durate.
‫Bene, quindi questo è il riassunto, anch'esso scritto male.
‫Quindi riassunto come questo.
‫Oh, e sì, ora volevo mostrarti il
‫sito web di Natours, in realtà.
‫Quindi torniamo alla nostra documentazione di Mongoose.
‫Ma questo è quello che voglio mostrarti.
‫Quindi Naturi. dev, che è l'originale di questa applicazione,
‫e quindi questi sono i dati che abbiamo nella nostra API
‫e che ovviamente abbiamo bisogno anche nel database.
‫Quindi abbiamo tutti questi dati.
‫Quindi questo nome del tour, abbiamo la difficoltà, abbiamo la durata, abbiamo,
‫questo è un riassunto, quindi abbiamo un
‫luogo di partenza, abbiamo la quantità di luoghi,
‫abbiamo una data di inizio,
‫abbiamo la dimensione massima
‫del gruppo in qui, e dobbiamo quotare,
‫la media di valutazione, la quantità
‫di valutazione.
‫Abbiamo anche un'immagine qui.
‫E poi qui nella pagina dei dettagli è dove abbiamo,
‫abbiamo il riassunto qui sotto.
‫Abbiamo le guide che ti ho appena mostrato su Postman prima.
‫Abbiamo altre immagini.
‫Abbiamo qui tutte le località e abbiamo
‫tutte le recensioni.
‫Ok, come ti dicevo, non tutti i
‫dati si trovano nella pagina Panoramica e quindi non
‫sono necessari anche tutti i dati.
‫Ok, allora torniamo qui.
‫Successivamente, voglio aggiungere una descrizione.
‫E questo è un tipo di String, e
‫impostiamo di nuovo trim su true.
‫E mi sono appena ricordato
‫che il riepilogo è in realtà nella pagina Panoramica.
‫E quindi rendiamo questo obbligatorio.
‫Quindi aggiungi qui alla
‫fine,
‫vero, un tour deve avere una descrizione.
‫Ok, il prossimo passo sarà specificare l'immagineCover.
‫E quindi queste sono le immagini che vedi nella pagina di
‫panoramica e quindi impostiamo questa in modo che richieda effettivamente questo ruolo.
‫Quindi il tipo dovrebbe essere stringa, perché
‫in pratica questo sarà semplicemente il nome
‫dell'immagine qui, che poi in
‫seguito saremo in grado di leggere dal file system.
‫Ok, quindi in realtà solo il nome dell'immagine.
‫Quindi fondamentalmente un riferimento verrà memorizzato nel database.
‫Ed è una pratica molto comune, ok?
‫Quindi potremmo archiviare anche l'intera immagine in un database, ma di
‫solito non è una buona idea.
‫Lasciamo semplicemente le immagini da qualche parte nel file system
‫e poi inseriamo il nome dell'immagine stessa
‫nel database come campo.
‫Quindi impostalo su obbligatorio,
‫vero, un tour deve avere un'immagine di copertina.
‫Bello, il prossimo è il resto delle immagini.
‫E ora qui, abbiamo qualcosa di nuovo, ok?
‫Perché abbiamo più immagini
‫e voglio salvare quelle immagini come un array.
‫E in effetti, come un array di stringhe.
‫E quindi il modo per farlo è
‫semplificare specificando qui un array di stringhe, proprio come questo.
‫Quindi voglio che sia ancora di tipo stringa, ma
‫voglio che sia un array.
‫Quindi un array in cui abbiamo un numero di stringhe.
‫Ed è così che posso definirlo, ok?
‫E lo useremo in seguito per qualcos'altro di nuovo.
‫E quindi passeremo effettivamente più opzioni
‫del tipo di schema rispetto a un semplice
‫tipo, e quindi per allora lo useremo di nuovo, va bene?
‫Per ora, però, andiamo avanti, e
‫il prossimo campo che volevo aggiungere
‫qui è il createdAt.
‫E il campo createdAt dovrebbe essere fondamentalmente un
‫timestamp che viene impostato dal momento in cui l'utente ottiene un nuovo tour.
‫Quindi questo qui dovrebbe ovviamente essere aggiunto automaticamente.
‫Anche in questo caso, al momento della creazione del tour.
‫Quindi come lo facciamo?
‫Bene, prima di tutto, impostiamo il tipo su Date.
‫Quindi Data è ancora un altro tipo di dati JavaScript incorporato e quindi
‫possiamo usarlo qui.
‫Ok, quindi il tipo è Data, quindi
‫dobbiamo semplicemente impostare un valore predefinito e
‫il valore predefinito è
‫la funzione incorporata JavaScript Date. Ora.
‫E sono sicuro che hai familiarità con questo.
‫Quindi questo ci darà semplicemente un timestamp in
‫millisecondi, che fondamentalmente rappresenta il millisecondo corrente.
‫Bene, ora a
‫Mongo, questo viene immediatamente convertito nella data odierna
‫per dare più senso a questi dati, ok?
‫Quindi sì, questo è il timestamp creato automaticamente.
‫E ora, finalmente, dobbiamo anche passare una serie di date.
‫E ora finalmente, per finire
‫per ora, vogliamo anche poter definire una serie di date di inizio.
‫Quindi startDates, e ancora, definiamo semplicemente un array e poi
‫diciamo che lì vogliamo le date.
‫Bene, quindi queste date di inizio sono fondamentalmente date diverse
‫in cui inizia un tour.
‫Ad esempio, possiamo avere un tour
‫che inizia a dicembre
‫di quest'anno, e poi a febbraio, l'anno
‫prossimo, e poi un altro
‫in estate, e quindi date diverse per
‫lo stesso tour sono semplicemente
‫diverse, diciamo, istanze del tour a partire da date diverse.
‫Va bene, spero che abbia senso.
‫Ad ogni modo, questo qui non verrà creato
‫automaticamente da MongoDB e MongoDB proverà quindi automaticamente ad
‫analizzare la stringa che abbiamo passato come data in
‫una vera data JavaScript.
‫Ad esempio, potremmo passare qualcosa
‫come diciamo 2021, 21 marzo, e di nuovo
‫Mongo lo analizzerebbe automaticamente
‫come una data.
‫Puoi anche specificare la data.
‫Ad esempio, dicendo 11 e 32 minuti, va bene.
‫Oppure potremmo anche semplicemente inserire un timestamp Unix, quindi
‫un timestamp come in questo formato qui.
‫Ok, quindi tutti questi formati,
‫in pratica, Mongo cercherà di analizzarli in una data.
‫E solo se non può, genererà un errore.
‫(espira) Quindi questo è stato un sacco di lavoro.
‫Facciamo un salvataggio qui.
‫E il modo in cui possiamo provarlo è andare
‫qui ai nostri dati di sviluppo, dove abbiamo
‫questo tour semplice. json, che è
‫quello che abbiamo usato in una sezione precedente.
‫Tutto bene.
‫E quindi tutto
‫ciò che farò qui sarà solo prendere
‫tutti questi dati qui, e poi usarli per creare una nuova richiesta, ok?
‫Quindi vogliamo creare una nuova richiesta POST qui e
‫con tutti quei
‫dati, invece di doverla scrivere manualmente.
‫Ok, quindi incollo tutto questo qui.
‫E ora in effetti, non abbiamo bisogno dell'ID.
‫Quindi ne avevamo
‫bisogno prima, quando stavamo facendo la nostra API
‫basata su file, ma ora è finita, quindi sbarazziamoci di quella.
‫E così tutto il
‫resto dei dati che abbiamo contrassegnato come obbligatori ora sono qui, e
‫anche un po' di più.
‫Quindi proviamo a vedere cosa succede quando lo sottoponiamo.
‫E ora riceviamo dati non validi inviati.
‫Quindi andiamo effettivamente al nostro controller del tour e qui,
‫dove creiamo un tour, invece di questo
‫messaggio torniamo indietro come lo avevamo prima
‫e inviamo l'intero errore solo così vediamo
‫cosa sta effettivamente andando storto.
‫Quindi invialo qui, ok, e il problema era che
‫abbiamo già definito The Snow Adventure.
‫Quindi prima liberiamoci di quello.
‫Sì, quindi qui abbiamo
‫The Snow Adventure, quindi dovremmo eliminarlo,
‫e per quello sto usando la nostra API, quindi
‫possiamo già utilizzarlo in qualche modo qui.
‫Quindi quello dovrebbe essere sparito,
‫e così ora dovremmo essere in grado di aggiungerlo come un nuovo tour.
‫E infatti, ora è qui.
‫Quindi ecco tutti i dati che abbiamo
‫appena specificato in questo bel formato.
‫Quindi ciò che è interessante ora è
‫vedere effettivamente il timestamp createAt.
‫Quindi è l'ora esatta in cui sto registrando questo video.
‫E quindi questo è stato ovviamente creato
‫automaticamente da questo pezzo di codice che abbiamo da qualche parte qui.
‫Sì, questo.
‫Quindi quella data proviene da questa data. ora timestamp
‫che JavaScript quindi analizza automaticamente
‫questa data piacevole e leggibile.
‫Allora qui abbiamo questi array.
‫Ok, quindi questo array
‫e un altro array e, naturalmente, l'ID generato automaticamente, ok?
‫Quindi, se veniamo
‫qui ora, abbiamo ovviamente tre tour.
‫Prima gli altri che non sono così completi,
‫e poi tutti questi.
‫Ora, ciò che è interessante vedere qui
‫è che Mongo ha anche aggiornato il tipo di tour che già avevamo.
‫Quindi, ad esempio, abbiamo avuto una valutazione
‫qui, ma ora che il nostro schema è
‫completamente cambiato, ha aggiunto questa media delle valutazioni
‫e anche questa quantità di valutazioni, entrambe ai valori predefiniti, e lo stesso
‫in realtà qui.
‫Ha anche creato questo timestamp.
‫Ha creato, sì, ha creato immagini e date di inizio, con
‫questi array vuoti.
‫E così ha cambiato tutti questi dati qui.
‫Va bene, quindi prima di iniziare ad andare avanti
‫in un progetto, dovremmo probabilmente
‫andare avanti ed eliminare tutti questi dati qui.
‫E in effetti, quello che faremo nel
‫prossimo video, ora che il nostro modello è finalmente
‫completato, almeno per
‫questa sezione, andremo avanti e scriveremo
‫un piccolo script che importerà automaticamente tutti i
‫tour da questi dati JSON.
‫Ok, quindi da questo file JSON, in realtà.
‫Quindi fondamentalmente leggerà il file,
‫otterrà tutti i tour e li importerà nel database.
‫Bene, questo è quello che faremo dopo, perché
‫sarà estremamente utile in questa sezione
‫e anche in futuro.