‫Istruttore: Ricordi come abbiamo un
‫campo per la valutazione media su ogni documento del tour?
‫Bene, fino a questo punto quel campo non contiene
‫davvero alcun dato significativo, vero?
‫Ma quindi ora cambiamo effettivamente
‫questo e calcoliamo le valutazioni medie in questa lezione.
‫Quindi archiviare un riepilogo di un set di dati
‫correlato sul set di dati principale è in realtà una tecnica
‫molto popolare nella modellazione dei dati che non avevo ancora menzionato.
‫E questa tecnica può effettivamente essere davvero
‫utile per evitare query
‫costanti del relativo set di dati.
‫Quindi nella nostra applicazione un ottimo esempio di questa tecnica
‫è memorizzare la valutazione media e il numero di valutazioni
‫su ogni tour, in modo da non dover interrogare le recensioni
‫e calcolare quella media ogni volta che interroghiamo
‫per tutti i tour, va bene.
‫Ad esempio, ciò potrebbe diventare molto
‫utile per una pagina di panoramica del tour nel
‫nostro front-end in cui non vogliamo davvero visualizzare tutte le
‫recensioni, ma vogliamo comunque mostrare un riepilogo di queste
‫recensioni, come ad esempio il numero di valutazioni e la media.
‫E in realtà abbiamo già i campi per questo nel
‫nostro schema del tour.
‫Quindi proprio qui all'inizio, credo.
‫Sì, quindi abbiamo la media
‫delle valutazioni e la quantità delle
‫valutazioni proprio qui, ma in questo momento sono
‫solo alcuni numeri e, naturalmente, non sono la media
‫effettiva e il numero delle valutazioni, perché
‫non l'abbiamo mai realmente calcolato in nessun momento in la
‫nostra applicazione, ma è esattamente quello che cambieremo in questo video.
‫Quindi in questo momento calcoleremo la valutazione media e
‫anche il numero di valutazioni di un
‫tour ogni volta che una nuova recensione viene aggiunta a
‫quel tour o anche quando una recensione viene aggiornata o cancellata,
‫perché sono esattamente le situazioni
‫in cui il numero o la media potrebbe cambiare, giusto.
‫Quindi, come lo implementeremo concretamente?
‫Bene, qui nel modello di recensione creeremo
‫una nuova funzione che
‫includerà un ID tour e
‫calcolerà la valutazione media e il numero di
‫valutazioni che esistono nella nostra raccolta per quel tour esatto.
‫Quindi alla fine la funzione aggiornerà anche
‫il documento del tour corrispondente.
‫Quindi, per utilizzare quella funzione, utilizzeremo
‫il middleware per chiamare sostanzialmente questa funzione ogni
‫volta che c'è una nuova recensione o una
‫viene aggiornata o eliminata, ok.
‫Quindi iniziamo ora scrivendo quella funzione e per
‫questo scriveremo effettivamente un metodo statico sul nostro schema,
‫e questa è una caratteristica di Mongoose che
‫non avevamo ancora usato.
‫Quindi abbiamo usato solo il metodo
‫di istanza, che possiamo chiamare
‫sui documenti e
‫sono anche molto utili, ma questa volta useremo davvero metodi statici.
‫Va bene.
‫Quindi, ancora una volta, questi possono essere chiamati direttamente sul modello,
‫ad esempio, come questa recensione. CalcStats, ok.
‫E il modo in cui funziona è ovviamente
‫reviewSchema e poi . statics e quindi il nome della funzione.
‫Quindi calcAverageRatings
‫è uguale a una funzione, che ricorda i take in un
‫ID tour, e quell'ID è ovviamente per
‫il tour a cui appartiene la recensione corrente.
‫E so che a questo punto probabilmente tutto
‫suona un po' confuso, ma non
‫preoccuparti una volta implementato
‫tutto questo e
‫anche quando lo testeremo avrà molto senso nella pratica, ok?
‫Ad ogni modo, per eseguire effettivamente il
‫calcolo, utilizzeremo nuovamente la pipeline di aggregazione, giusto.
‫Quindi ricordiamolo nel nostro strumento di controllo, quindi proprio qui
‫usiamo la pipeline di aggregazione
‫per creare anche alcune statistiche come questa, ok.
‫Quindi abbiamo usato il metodo aggregato, che abbiamo chiamato
‫direttamente sul modello, ok.
‫Quindi ora nel nostro metodo di istanza possiamo effettivamente fare
‫la stessa identica cosa.
‫Quindi, in un metodo statico come questo, queste parole
‫chiave puntano effettivamente al modello corrente.
‫Ecco perché possiamo usare questo. aggregato, perché
‫ricorda che dobbiamo chiamarlo. aggregare direttamente sul
‫modello, ed è esattamente per questo
‫che stiamo usando un metodo statico qui in primo luogo.
‫Perché di nuovo questo ora punta
‫al modello e dobbiamo chiamare aggregato sempre sul modello, ok.
‫Quindi in aggregato dobbiamo passare in una
‫serie di tutte le fasi che vogliamo in aggregato, ok.
‫Allora cosa vogliamo fare prima?
‫Bene, il primo passo dovrebbe essere quello di selezionare tutte le
‫recensioni che appartengono effettivamente al
‫tour corrente che è stato passato come argomento.
‫Va bene.
‫Quindi la nostra prima fase è una fase di
‫corrispondenza,
‫ricordalo, quindi qui abbiamo passato il
‫nostro oggetto filtro e possiamo dire tour uguale
‫a tour, ma non ne abbiamo
‫davvero bisogno, come già sai, quindi rimuoviamo questo parte, o in realtà
‫solo per rendere un po' meno confuso
‫qui con i nomi chiamiamo questo qui ID tour, ok.
‫Quindi ho fatto un giro qui,
‫ok.
‫Quindi in questo modo
‫selezioniamo solo un tour che vogliamo effettivamente aggiornare, ok.
‫Ora nella fase successiva calcoliamo effettivamente
‫le statistiche stesse, e
‫per questo usiamo una fase a gironi.
‫E nella fase di gruppo ricorda
‫che il primo campo che dobbiamo specificare è l'ID, quindi _id e poi il campo comune
‫che tutti i documenti hanno
‫in comune e in base al
‫quale vogliamo raggruppare e quindi questo sarà di
‫nuovo il tour.
‫Quindi, proprio come nel nostro precedente esempio di calcolo
‫statistico, qui abbiamo raggruppato per difficoltà.
‫Quindi in questo modo calcoliamo le statistiche per i tour facili
‫e le statistiche per i
‫medi e quindi le statistiche per i tour difficili.
‫Quindi, in questo esempio, abbiamo raggruppato tutti i tour
‫in base alla loro
‫difficoltà, ok.
‫Ma qui, ovviamente, stiamo raggruppando tutti i tour
‫per tour.
‫Grande.
‫Ora il numero di valutazioni, ricorda
‫come lo facciamo,
‫quindi tutto ciò che facciamo è praticamente
‫aggiungerne uno per ogni tour che
‫abbiamo, quindi ogni tour che è stato abbinato nel passaggio precedente, ok.
‫Quindi, se ci sono cinque documenti di revisione per il
‫tour corrente, per ciascuno di questi documenti ne verrà aggiunto uno.
‫Quindi alla fine il numero di valutazioni
‫sarà cinque, e ancora, perché ovviamente abbiamo cinque documenti di revisione.
‫Quindi ha senso, no?
‫Poi anche il voto medio, che come prima usiamo l'operatore
‫medio e questo deve essere all'interno di un oggetto e
‫qui
‫dentro il nome del
‫campo che è il voto, giusto.
‫Quindi ricorda come ogni recensione ha un campo di valutazione.
‫Quindi è da lì che vogliamo calcolare la media.
‫Ok, e in effetti è così.
‫Quindi il numero e la media
‫delle valutazioni è esattamente ciò che volevamo calcolare in questa aggregazione.
‫Ora tieni presente che questo restituisce effettivamente
‫una promessa e quindi dobbiamo aspettarlo e quindi
‫memorizzarlo in una variabile chiamata stats.
‫Va bene.
‫Quindi contrassegna anche questo qui come asincrono,
‫salvalo e
‫quindi ora abbiamo effettivamente bisogno di usare quella variabile stats.
‫Per ora tutto ciò che voglio fare solo
‫per testare questo è effettivamente registrare le statistiche sulla console.
‫Consolle. statistiche
‫di registro.
‫Ok, nel passaggio successivo vorremmo effettivamente, come ho detto prima,
‫quindi aggiornare il documento del tour con queste statistiche,
‫ma lo lascerò per un
‫po' più tardi, perché per ora
‫abbiamo davvero bisogno di chiamare questo
‫metodo qui da qualche parte , perché
‫altrimenti le statistiche qui non verranno mai chiamate.
‫E ricorda come abbiamo detto
‫all'inizio che lo faremo usando il middleware
‫ogni volta che viene creata una nuova recensione.
‫Quindi implementiamolo usando il pre-salvataggio di reviewSchema e
‫poi
‫solo la nostra normale funzione middleware qui.
‫E ricorda che in questo tipo
‫di middleware questa parola chiave punta al documento
‫che è attualmente in fase di salvataggio.
‫Quindi questo punta alla
‫recensione attuale, ok.
‫Quindi vorremo chiamare la funzione calcAverageRating
‫usando questo. giro, giusto.
‫Ora come chiameremo effettivamente questa funzione?
‫Ricorda come ho
‫detto che questa funzione è disponibile sul modello.
‫Quindi fondamentalmente come questa recensione
‫metti. calcAverageRatings e poi
‫come ho detto vogliamo usare questo. giro, ok.
‫E ancora, perché questa è la
‫recensione corrente e questo è quindi l'ID del tour
‫che passeremo all'interno di calcAverageRatings.
‫Ora il problema è che a questo punto qui nel
‫codice la variabile di revisione non è ancora definita.
‫Ora potresti pensare che la soluzione semplice sarebbe
‫spostare semplicemente questo codice qui dopo questa dichiarazione di revisione, ma sfortunatamente
‫non funzionerà, perché proprio come in Express
‫questo codice qui viene eseguito sostanzialmente nella sequenza
‫in cui è dichiarato.
‫Quindi, se dovessimo inserire questo codice
‫qui dopo la dichiarazione di revisione, questo schema di revisione
‫qui non conterrebbe questo middleware, perché
‫lo dichiareremmo solo dopo che il
‫modello di revisione è stato già creato, ok, ma fortunatamente
‫c'è ancora un modo per aggirare questo e questo
‫è usare questo. costruttore.
‫Quindi questo qui punta ancora al modello.
‫Sai, fondamentalmente di nuovo questo è il documento corrente
‫e il costruttore è fondamentalmente il modello
‫che ha creato quel documento.
‫Quindi questo qui sta per
‫il tour e quindi possiamo semplicemente farlo in questo modo.
‫Quindi chiama il prossimo come sempre e basta.
‫Quindi ora andiamo avanti e proviamo questo.
‫E per farlo creerò prima un nuovo tour, perché
‫gli altri che abbiamo già hanno
‫la media e il
‫numero di valutazioni già calcolati e
‫quindi vogliamo davvero ricominciare da zero qui quando lo testiamo.
‫Quindi, per creare un nuovo tour dobbiamo essere registrati
‫come amministratori, e penso che lo siamo attualmente, ma solo per
‫assicurarci di farlo di nuovo.
‫Va bene.
‫Quindi questo è il nuovo tour di prova.
‫Va bene, rimuoviamoli qui, non sono obbligatori e penso
‫che con questo siamo a posto.
‫Va bene, e qui vedi i valori predefiniti che abbiamo impostato
‫prima, quindi le valutazioni sono in
‫media per cinque e la quantità impostata su zero, ok.
‫Ora, per creare una nuova recensione, dobbiamo
‫essere registrati come utente normale, quindi
‫non come amministratore.
‫Quindi prendiamo un utente normale, diciamo.
‫Quindi usiamo questa Laura qui.
‫Allora Laura@esempio. com e
‫come ho detto prima la password è sempre la stessa.
‫Quindi facciamolo e ora creeremo una nuova recensione in tour.
‫Quindi ora prendiamo il tour che abbiamo creato
‫in precedenza, quindi questo ID e lo mettiamo qui nell'URL.
‫Ok, quindi ricorda che questo
‫percorso ora ottiene automaticamente un ID tour
‫dall'URL e un ID utente dall'utente attualmente connesso,
‫ok.
‫Quindi usiamo questa come prima
‫valutazione, inviamola e ora voglio dare un'occhiata alla nostra console.
‫Abbiamo un output qui, ma per qualche motivo è
‫solo come questo array vuoto.
‫Quindi qualcosa non deve funzionare qui.
‫Quindi diamo un'occhiata all'ID del tour qui solo per
‫assicurarci di ottenere il valore giusto qui, ID e commentiamo
‫anche questa parte qui
‫solo per vedere se forse c'è qualche errore in
‫questa parte, quindi ora proviamo nuovamente.
‫Aggiungerò semplicemente lo stesso di nuovo qui, ok.
‫Ok, quindi ora otteniamo davvero qualcosa.
‫Quindi abbiamo questa recensione che è
‫quella che abbiamo creato inizialmente.
‫Quindi inizia con questo ac15,
‫ma quello che ho appena creato è questo 66d, ok.
‫Quindi diamo un'occhiata a questo qui in Compass.
‫Quindi dobbiamo andare all'ultima pagina.
‫Ok, quindi quello che appare nella nostra console
‫è solo questo qui, ma non il
‫secondo che abbiamo appena creato, ok.
‫Quindi, se ora ne creiamo
‫un terzo, probabilmente dovremmo vedere il primo e il secondo.
‫Quindi proviamolo.
‫Va bene.
‫Invia questo e ora qui nel nostro
‫output li ottengo tutti e tre.
‫Quindi non ha molto senso, ma comunque
‫il punto che volevo chiarire qui
‫è che non dovremmo usare
‫pre, ma invece dovremmo usare il middleware post-salvataggio, ok.
‫E questo perché al momento del
‫salvataggio la recensione corrente
‫non è ancora nella raccolta.
‫Quindi, quando eseguiamo questa corrispondenza qui, non dovrebbe
‫essere in grado di apparire nell'output qui,
‫perché di nuovo in questo
‫momento non è ancora stato realmente salvato nella raccolta, ok.
‫Quindi è meglio usare post
‫qui, perché in quel momento, ovviamente, tutti
‫i documenti sono già salvati nel database e quindi è
‫un ottimo momento per
‫fare effettivamente questo calcolo con tutte le recensioni già e
‫quindi memorizzare il risultato sul tour .
‫Ok, quindi non sono
‫davvero sicuro del perché questo qui sia effettivamente
‫apparso a questo punto, ma comunque ora proviamo con un altro.
‫Quindi questo è il quarto,
‫e ora otteniamo successivo non è una funzione e infatti,
‫come ho detto prima, il middleware
‫post non ha accesso a
‫successivo e quindi, ovviamente, non possiamo chiamarlo, non possiamo
‫usarlo.
‫Va bene, quindi qui abbiamo la nostra prossima valutazione,
‫ok.
‫Quindi ora compare anche qui.
‫Quindi non ne abbiamo bisogno e ora possiamo tranquillamente
‫provare a calcolare le nostre statistiche qui.
‫Salvalo e in realtà eliminiamo
‫tutte queste recensioni.
‫Quindi fondamentalmente voglio ricominciare da zero, ok.
‫Quindi tutte
‫queste cinque recensioni qui dovrebbero andare e
‫ora siamo pronti per partire.
‫Quindi creiamo effettivamente questo come il primo
‫e ora andiamo avanti e diamo un'occhiata alle nostre statistiche
‫ed eccoci qui.
‫Quindi questo è l'ID del
‫tour corrente, quindi il numero di valutazioni è
‫uno e la media è ovviamente tre.
‫Quindi, se ne aggiungiamo un altro con il punteggio di cinque,
‫la media dovrebbe essere quattro e il
‫numero di voti dovrebbe essere pari a due.
‫Quindi proviamoci e in effetti proprio come ho detto due
‫valutazioni, una media di quattro.
‫E solo un altro solo per essere davvero sicuri,
‫aggiungiamone un altro
‫con cinque, ed eccoci qui.
‫Grande.
‫Quindi ora stiamo calcolando correttamente le statistiche, ma
‫ovviamente non vengono ancora
‫mantenute nel documento del tour corrente.
‫Quindi, se veniamo qui in Compass al tour
‫che abbiamo appena
‫creato, probabilmente è l'ultimo qui.
‫Sì, quindi il nostro tour di prova ha ancora questi valori
‫predefiniti di 4. 5 e zero,
‫ok.
‫Quindi ora è il momento
‫di mantenere effettivamente le statistiche calcolate in questo documento
‫del tour, ok.
‫E quindi facciamolo.
‫Prima di tutto, per poterlo
‫fare, abbiamo bisogno del modello del tour, giusto.
‫Quindi il
‫tour richiede
‫e ci siamo.
‫Quindi quello che dobbiamo fare è sostanzialmente
‫trovare il tour attuale e quindi aggiornarlo.
‫Quindi l'abbiamo fatto prima molte volte,
‫findById e update,
‫ok.
‫E l'ID è ovviamente l'ID del tour che è
‫stato passato nella funzione e
‫quindi un oggetto dei dati che vogliamo effettivamente aggiornare.
‫Quindi prendiamo questi nomi di campo da qui.
‫Quindi abbiamo valutazioniQuantità da
‫un lato.
‫Mettiamolo qui a uno per ora solo così
‫non otteniamo un errore e
‫valutazioni nella media.
‫Ancora una volta, per evitare
‫errori, perché ora voglio
‫venire qui e dare un'occhiata a queste statistiche.
‫Quindi vedi che in realtà sono memorizzati in un array, ok.
‫Quindi dobbiamo andare alla prima posizione di quell'array, che è dove
‫si trova questo oggetto.
‫Quindi le statistiche alla posizione
‫zero e poi da lì otteniamo la proprietà di valutazione finale,
‫ok.
‫Quindi questo qui.
‫E poi ovviamente lo stesso per la valutazione media.
‫Va bene.
‫E ora dobbiamo anche aspettarlo.
‫Quindi come sempre questo restituisce una premessa e quindi possiamo aspettarlo.
‫Ora potremmo anche memorizzare il risultato di questo in una
‫variabile, ma non abbiamo affatto bisogno del tour.
‫Tutto ciò che vogliamo fare è aggiornarlo
‫davvero, quindi non memorizziamo
‫il valore dei risultati della premessa da nessuna parte.
‫Va bene.
‫Quindi proviamo semplicemente ad aggiungere un'altra recensione qui,
‫questa volta con una terribile.
‫Va bene.
‫E prima di tutto, diamo un'occhiata alle statistiche.
‫Quindi, ovviamente, otteniamo la valutazione di quattro, quindi il numero di
‫valutazioni e la media di 3. 5.
‫Quindi ora per vedere davvero se ha funzionato,
‫diamo un'occhiata a Compass o possiamo anche usare o
‫ottenere il punto finale del
‫tour, ok.
‫Quindi abbiamo bisogno dell'ID del tour, che possiamo
‫copiare da qui, incollarlo qui, e ora arriva
‫il momento e in effetti ha
‫funzionato, perfetto.
‫Quindi è fantastico, assolutamente fantastico.
‫Ancora una volta per il gusto di
‫farlo, aggiungiamo un'altra recensione qui.
‫Va bene.
‫Aggiorna questo, così ora ne otteniamo cinque e
‫la nostra media è aumentata un po'.
‫Grande.
‫Quindi ora prendiamoci solo un secondo e ricapitoliamo quello che abbiamo fatto qui.
‫Quindi abbiamo iniziato creando un metodo statico.
‫Quindi questa intera funzione
‫qui per creare sostanzialmente le statistiche della
‫media e il numero di valutazioni per l'ID
‫tour per cui è stata creata la recensione corrente, ok.
‫E abbiamo creato questa funzione come metodo
‫statico, perché dovevamo chiamare la funzione di aggregazione
‫sul modello.
‫Quindi in un metodo statico questa variabile
‫chiama esattamente un metodo.
‫Quindi è molto utile in questi casi.
‫Quindi abbiamo costruito la nostra pipeline di aggregazione qui,
‫dove abbiamo selezionato tutte le recensioni che corrispondevano
‫all'ID del tour corrente, e poi sono state calcolate,
‫le statistiche per tutte queste recensioni.
‫Quindi, dopo aver
‫fatto ciò, abbiamo salvato le statistiche nel tour corrente, ok.
‫Quindi, per utilizzare effettivamente questa
‫funzione, la chiamiamo dopo che è stata creata una nuova recensione, ok.
‫Per questo dobbiamo usare questo. costruttore perché questo
‫è ciò che punta al modello corrente.
‫Ora tieni presente come abbiamo detto che vogliamo
‫aggiornare anche le statistiche ogni volta che una recensione viene modificata o
‫cancellata, perché queste azioni,
‫ovviamente, influenzeranno anche il numero e la media.
‫Tuttavia, farlo è un po' più complesso.
‫Quindi, dal momento che questo video è già abbastanza
‫lungo, lasciamo questo al prossimo.