‫Istruttore: Quindi, questa è la
‫seconda parte del calcolo delle statistiche di revisione.
‫Questa volta, per quando una recensione viene aggiornata o eliminata.
‫E questa parte è in realtà
‫un po' più difficile perché,
‫tieni presente che una recensione viene
‫aggiornata o
‫eliminata utilizzando findByIdAndUpdate o anche findByIdAndDelete, giusto?
‫Quindi, per questi, in realtà non abbiamo il middleware dei
‫documenti, ma solo il middleware delle query, ok.
‫E quindi nella query, in realtà non
‫abbiamo accesso diretto al documento per fare qualcosa di
‫simile a questo, ok.
‫Perché, ricorda, abbiamo bisogno di accedere alla recensione corrente,
‫in modo che da lì possiamo estrarre l'ID
‫del tour e quindi calcolare le statistiche da lì, giusto, ma di
‫nuovo, per questi hook qui,
‫abbiamo solo il middleware di query, ok.
‫Ma ora lascia che ti mostri
‫un bel trucco per aggirare effettivamente questa limitazione.
‫Quindi, implementeremo un pre-middleware
‫per questi hook, fondamentalmente per questi eventi.
‫Quindi pre, e poi di nuovo userò un'espressione regolare
‫per una stringa che inizia con findOneAnd
‫e il gioco è fatto.
‫E quindi
‫questo funzionerà per findOneAndUpdate e findOneAndDelete
‫perché, ricorda che dietro
‫le quinte, findByIdAndUpdate è solo
‫una scorciatoia per findOneAndUpdate con l'ID corrente, giusto.
‫Quindi qui, abbiamo effettivamente bisogno di usare
‫gli hook del middleware findOneAndDelete e findOneAndUpdate, va bene.
‫Quindi, funzione, e ottiene la parola chiave successiva
‫perché è pre-middleware.
‫Quindi, ricorda che l'obiettivo è ottenere l'accesso
‫al documento di revisione corrente, ok,
‫ma qui, questa parola chiave è la query corrente.
‫Ora, come lo aggireremo?
‫Bene, possiamo fondamentalmente eseguire una query e poi
‫questo ci darà il documento che è
‫attualmente in fase di elaborazione.
‫Quindi, per farlo, possiamo usare findOne.
‫E questo è tutto.
‫Quindi tutto ciò che dobbiamo fare è attendere questa query e quindi
‫salvarla da qualche parte.
‫Quindi chiamiamola r, che sta per revisione, ok.
‫Quindi salvalo come asincrono.
‫E questo è tutto.
‫E solo per assicurarci che
‫funzioni qui, per ora registriamo questo sulla console, ok.
‫Quindi, senza fare alcun calcolo, tutto
‫ciò che ci
‫interessa è vedere se questo bel trucco funziona.
‫Quindi, in pratica, il trucco di aggirarlo in
‫un middleware di query,
‫abbiamo solo accesso alla query.
‫Quindi, di nuovo, dobbiamo ottenere l'accesso
‫al documento, quindi eseguiamo sostanzialmente questa query
‫utilizzando findOne.
‫Va bene, quindi aggiorniamo una recensione, quindi aggiorniamo effettivamente
‫l'ultima che abbiamo fatto, va bene, e
‫la valutazione,
‫ora impostiamola a quattro.
‫Quindi prima erano
‫cinque e ora lo stiamo cambiando in quattro.
‫Quindi
‫lo ha inviato, ed ecco la recensione.
‫Ora, naturalmente, la valutazione è ancora impostata
‫su cinque a questo punto, perché questo findOne
‫qui prende davvero il documento dal database,
‫e quindi a questo punto, in pre, non
‫ha ancora mantenuto alcuna modifica al database, e quindi
‫erano le cinque prima,
‫e adesso saranno ancora le cinque.
‫Ma questo non ha
‫molta importanza qui perché tutto ciò che ci interessa è questo ID.
‫In realtà, questo ID tour, giusto, perché
‫è quello che
‫ci servirà per calcolare le valutazioni medie.
‫Ok, quindi ora usiamo quella funzione.
‫Ok, ora pensiamo a questo
‫perché se dovessimo usare questa funzione calcAverageRatings in
‫questo momento,
‫allora calcoleremmo le statistiche
‫usando i dati non aggiornati, ok.
‫E quindi questo è esattamente lo stesso motivo
‫per cui quassù dovevamo usare anche post e non
‫pre, ok, perché solo dopo che il documento è
‫già stato salvato nel
‫database ha senso calcolare le valutazioni.
‫E quindi qui è esattamente la stessa cosa,
‫con la grande differenza che non possiamo semplicemente cambiare
‫questo pre in post.
‫Quindi non possiamo farlo perché in questo momento non
‫abbiamo più accesso alla query perché la query
‫è già stata eseguita, giusto, e quindi senza la
‫query, non
‫possiamo salvare il documento di revisione
‫e quindi non possiamo eseguire questa funzione.
‫Quindi, questo è davvero confuso, lo capisco, ma ho davvero deciso
‫di creare questa lezione in questo modo perché, beh,
‫è davvero l'unica soluzione
‫intorno a questo problema, ed è davvero un
‫ottimo esercizio per te capire fondamentalmente questa Hello Experience.
‫Quindi, la soluzione per questo è ora usare
‫post, quindi, reviewSchema, quindi praticamente lo
‫stesso, quindi copiamo tutto questo, rendiamoci la vita
‫un po' più facile, sbarazziamoci di questo
‫e sbarazziamoci del prossimo.
‫Qui, dobbiamo anche chiamare il
‫prossimo, ok, ma poi lo facciamo post, ok.
‫E quindi ora questo
‫punto nel tempo, quindi dopo che la query
‫è già terminata, e quindi la revisione è stata aggiornata, questo
‫è un momento perfetto nel tempo
‫in cui possiamo quindi chiamare questa funzione.
‫Quindi, calcola le valutazioni medie.
‫Ma da dove otteniamo ora l'ID del tour?
‫Bene, dovremo usare un trucco
‫che è fondamentalmente quello di passare i dati dal
‫pre-middleware al post middleware.
‫Quindi, invece di salvare questo documento in una semplice variabile,
‫lo salveremo in questo. R.
‫Quindi, in pratica, creiamo una proprietà su questa variabile.
‫Ok, quindi ora qui, abbiamo ancora accesso a quello.
‫E quindi ora possiamo dire questo. r, che ricorda è la recensione, e
‫poi . tour.
‫Quindi, questo è di nuovo abbastanza confuso, ma
‫anche abbastanza divertente una volta capito come
‫funziona davvero, ok.
‫Ora, di nuovo, abbiamo bisogno di qualcosa di simile
‫qui per chiamare effettivamente questa funzione qui perché
‫ricorda che questo in
‫effetti è un metodo statico, e quindi dobbiamo chiamarlo sul modello.
‫Ora, dov'è questo modello in questo caso?
‫Bene, è a questo. r, che in questo caso
‫è equivalente a
‫questo qui in questo middleware,. costruttore. calcAverageRatings.
‫Woo, sembra piuttosto opprimente, non è vero?
‫Certo, dobbiamo aspettarlo, quindi è per questo che l'abbiamo
‫dichiarato asincrono, ok.
‫Quindi, ancora una volta, abbiamo utilizzato questo modo per passare i
‫dati dal middleware pre al middleware post, e quindi
‫qui abbiamo recuperato il
‫documento di revisione da questa variabile.
‫Ok, e ancora, dovevamo farlo in questo modo
‫perché a questo punto la query era già stata eseguita
‫e quindi
‫non potevamo farlo qui.
‫E in realtà scriviamolo; NON
‫funziona qui, la query è già stata eseguita.
‫Ottimo, e con questo dovremmo
‫essere pronti per testarlo.
‫Quindi andiamo avanti e aggiorniamo questo qui
‫ancora una volta, e impostiamolo su una valutazione di uno, va bene.
‫Diamo ora un'occhiata qui, finché non vedi che il numero di valutazioni è
‫ancora cinque, ma la media
‫ora è solo tre, e ora la domanda è
‫se questo si è davvero aggiornato anche durante
‫il tour, e, sì, in effetti, lo
‫ha fatto .
‫Quindi, cinque voti con una media di tre.
‫Ottimo, ora aggiorniamone un altro.
‫Quindi, per questo, prendiamo tutte le nostre recensioni,
‫e in realtà non le vogliamo
‫tutte, ma solo l'ultima.
‫E qui ho ancora
‫questo filtro, quindi dovrei liberarmene, quindi
‫otteniamo tutti i
‫65 risultati, quindi tutte queste recensioni, ma vogliamo solo le ultime, quindi
‫quelle che abbiamo appena creato.
‫Allora aggiorniamoci...
‫Non ne sono sicuro, perché in realtà non sono in ordine qui.
‫Andiamo, ok, quindi qui abbiamo quelli più recenti.
‫Quindi permettetemi ora di aggiornare questo qui, diciamo, quattro, solo
‫come test finale, e così questo dovrebbe
‫aumentare un po' la media.
‫E infatti lo ha fatto.
‫Quindi, 3. 6 ora e, naturalmente, il numero è
‫ancora cinque perché non hai aggiunto una nuova recensione.
‫Quindi funziona alla grande con l'aggiornamento, ora
‫proviamolo anche con l'eliminazione.
‫Quindi andiamo avanti e cancelliamo
‫la recensione che abbiamo appena aggiornato e quindi ora
‫dovremmo essere solo quattro, e infatti, eccoci qui.
‫Quindi ora, solo quattro.
‫Ed effettivamente eliminiamoli tutti.
‫Quindi, questo è il prossimo.
‫Ah, eccoci qui.
‫Poi anche questo.
‫Quindi, ora dovremmo
‫essere solo tre o, in realtà,
‫ce ne sono rimasti solo due con una media di quattro.
‫Quindi vediamo quale ci rimane ancora.
‫Quindi è questo con tre e questo con cinque.
‫Ed ecco perché abbiamo questa media di quattro.
‫Quindi liberiamoci di questo e quindi ora la nostra
‫media dovrebbe essere cinque, giusto?
‫O addirittura tre perché l'unico rimasto ne
‫ha tre.
‫E ora il test finale, l'eliminazione dell'ultimo,
‫solo per vedere cosa succederà una volta che lo avremo fatto.
‫E qui otteniamo un errore.
‫Quindi, non è possibile leggere la proprietà nRating di undefined.
‫Quindi questo è calcAverageRatings alla riga numero 69.
‫Quindi, non so cosa sia.
‫Quindi, riga 69, e quindi, è questo problema qui.
‫Quindi stiamo cercando di leggere nRating di undefined.
‫Quindi le statistiche zero sono sostanzialmente indefinite.
‫E questo perché se non ci sono documenti
‫che corrispondono a questa query qui in pratica, beh,
‫allora otteniamo semplicemente un array vuoto.
‫E quindi è proprio quello che abbiamo quaggiù.
‫Quindi questo è l'array delle statistiche e quindi in questo
‫momento non ha alcun risultato, ok,
‫quindi dovremmo eseguire questo pezzo di codice qui solo ogni
‫volta che effettivamente abbiamo qualcosa nell'array delle statistiche.
‫Quindi facciamolo.
‫Quindi se le statistiche. la lunghezza
‫è maggiore di zero, beh, allora fallo.
‫E se no, beh, in pratica significa che
‫tutte le nostre recensioni sono sparite, beh, allora
‫in pratica vogliamo tornare all'impostazione predefinita.
‫Quindi lo imposteremo alla quantità
‫di zero e alla media di 4. 5, che ricorda, è l'impostazione predefinita quando non ci
‫sono recensioni.
‫Quindi creiamo rapidamente una nuova recensione, e può
‫essere questa, va bene, quindi siamo
‫tornati ad
‫avere una valutazione e ora la cancelliamo subito, solo per
‫testare quel pezzo
‫di codice che abbiamo appena scritto, solo per vederlo qui anche,
‫quindi una valutazione, media cinque.
‫E ora quando lo eliminiamo,
‫non riceviamo più un errore.
‫E nel nostro tour, siamo tornati
‫a zero e un valore predefinito di 4. 5.
‫Va bene, va bene, va bene, perfetto.
‫Quindi prendiamo ancora solo un secondo veloce
‫qui per ricapitolare quello che abbiamo appena fatto.
‫Quindi, per poter eseguire questa funzione
‫anche in fase di aggiornamento e cancellazione, abbiamo effettivamente
‫bisogno di utilizzare il middleware di query
‫che Mongoose ci fornisce per queste situazioni.
‫Ok, quindi, non abbiamo un middleware per
‫documenti a portata di mano, che funziona, per queste funzioni, ma
‫invece abbiamo bisogno di
‫usare il middleware di query, e in
‫quello non abbiamo accesso direttamente al documento corrente.
‫E quindi dobbiamo
‫aggirare il problema usando questo
‫findOne qui, e quindi fondamentalmente recuperando il documento corrente dal database.
‫Quindi lo memorizziamo nella variabile di
‫query corrente, e quindi è questo, e così facendo,
‫otteniamo l'accesso ad esso nel middleware post.
‫Ed è solo nel post middleware che calcoliamo effettivamente
‫le statistiche per le recensioni.
‫E ricorda che lo facciamo in questo modo perché se
‫lo facessimo correttamente in
‫questa funzione middleware, i dati sottostanti non sarebbero
‫stati aggiornati a quel punto e
‫quindi le statistiche calcolate non sarebbero state aggiornate.
‫Ed ecco perché abbiamo usato questo processo in
‫due fasi qui fondamentalmente.
‫Ora, liberiamoci di questa console. log qui, visto che ora abbiamo finito, e anche
‫di queste statistiche.
‫Quindi, spero che questo sia stato divertente per
‫te e non troppo travolgente.
‫Ho progettato questo esercizio in modo specifico in
‫modo da poter risolvere un problema aziendale
‫reale utilizzando tutti gli strumenti che Mongoose ci offre.
‫E quindi, con questo, spero che tu abbia imparato un
‫po' meglio come lavorare con tutti questi diversi
‫middleware in situazioni diverse ogni volta che è necessario
‫in una situazione del mondo reale.
‫Quindi, ottimo lavoro per aver terminato questa
‫lezione piuttosto impegnativa e per essere ancora con me a questo punto del corso.
‫È davvero bello per me da vedere, quindi ne
‫sono davvero felice.
‫Ma comunque, ci sono ancora altri fantastici contenuti
‫in arrivo in questa sezione, quindi ora andiamo avanti insieme,
‫direttamente al prossimo video.