All language subtitles for 022 Calculating Average Rating on Tours - Part 1_Downloadly.ir_en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated: 1 00:00:01,300 --> 00:00:03,180 Remember how we have a field 2 00:00:03,180 --> 00:00:06,500 for the average rating on each tour document? 3 00:00:06,500 --> 00:00:09,860 Well up until this point that field doesn't really hold 4 00:00:09,860 --> 00:00:12,110 any meaningful data, does it? 5 00:00:12,110 --> 00:00:14,290 But so let's now actually change that 6 00:00:14,290 --> 00:00:17,233 and calculate average ratings in this lecture. 7 00:00:18,920 --> 00:00:22,410 So storing a summary of a related data set 8 00:00:22,410 --> 00:00:26,270 on the main data set is actually a very popular technique 9 00:00:26,270 --> 00:00:29,900 in data modeling that I hadn't actually mentioned yet. 10 00:00:29,900 --> 00:00:32,720 And this technique can actually be really helpful 11 00:00:32,720 --> 00:00:34,750 in order to prevent constant queries 12 00:00:34,750 --> 00:00:36,890 of the related data set. 13 00:00:36,890 --> 00:00:40,110 So in our application a great example of this technique 14 00:00:40,110 --> 00:00:43,320 is to store the average rating and the number of ratings 15 00:00:43,320 --> 00:00:46,870 on each tour, so that we don't have to query the reviews 16 00:00:46,870 --> 00:00:49,860 and calculate that average each time that we query 17 00:00:49,860 --> 00:00:52,150 for all the tours, okay. 18 00:00:52,150 --> 00:00:54,380 For example, that could become very useful 19 00:00:54,380 --> 00:00:57,280 for a tour overview page in our front-end 20 00:00:57,280 --> 00:01:00,320 where we really do not want to display all the reviews, 21 00:01:00,320 --> 00:01:03,350 but still want to show a summary of these reviews, 22 00:01:03,350 --> 00:01:06,730 like for example, the number of ratings and the average. 23 00:01:06,730 --> 00:01:09,130 And actually we already have the fields for that 24 00:01:09,130 --> 00:01:10,433 in our tour schema. 25 00:01:11,450 --> 00:01:15,870 So right here at the beginning, I think. 26 00:01:15,870 --> 00:01:17,660 Yeah, so we have the ratings average 27 00:01:17,660 --> 00:01:19,760 and ratings quantity right here, 28 00:01:19,760 --> 00:01:22,380 but right now they're only just some numbers 29 00:01:22,380 --> 00:01:25,307 and of course, they are not the actual average 30 00:01:25,307 --> 00:01:27,560 and the number of ratings, because we never 31 00:01:27,560 --> 00:01:30,840 really calculated that at any point in our application, 32 00:01:30,840 --> 00:01:34,290 but that's exactly what we're gonna change in this video. 33 00:01:34,290 --> 00:01:37,370 So right now we're gonna calculate the average rating 34 00:01:37,370 --> 00:01:39,750 and also the number of ratings of a tour 35 00:01:39,750 --> 00:01:43,330 each time that a new review is added to that tour 36 00:01:43,330 --> 00:01:47,000 or also when a review is updated or deleted, 37 00:01:47,000 --> 00:01:49,230 because that's exactly the situations 38 00:01:49,230 --> 00:01:52,830 when the number or the average might change, right. 39 00:01:52,830 --> 00:01:55,920 So how are we actually going to implement this? 40 00:01:55,920 --> 00:01:58,800 Well back here in the review model 41 00:01:58,800 --> 00:02:00,620 we're gonna create a new function 42 00:02:00,620 --> 00:02:02,690 which will take in a tour ID 43 00:02:02,690 --> 00:02:05,690 and calculate the average rating and the number of ratings 44 00:02:05,690 --> 00:02:09,410 that exist in our collection for that exact tour. 45 00:02:09,410 --> 00:02:11,880 Then in the end the function will even update 46 00:02:11,880 --> 00:02:14,020 the corresponding tour document. 47 00:02:14,020 --> 00:02:16,360 Then in order to use that function 48 00:02:16,360 --> 00:02:19,510 we will use middleware to basically call this function 49 00:02:19,510 --> 00:02:22,650 each time that there is a new review or one is updated 50 00:02:22,650 --> 00:02:24,980 or deleted, okay. 51 00:02:24,980 --> 00:02:28,030 So let's now start by writing that function 52 00:02:28,030 --> 00:02:31,370 and for that we're actually gonna write a static method 53 00:02:31,370 --> 00:02:34,510 on our schema, and that's a feature of Mongoose 54 00:02:34,510 --> 00:02:36,580 that we hadn't used yet. 55 00:02:36,580 --> 00:02:38,630 So we only used instance method, 56 00:02:38,630 --> 00:02:40,500 which we can call on documents 57 00:02:40,500 --> 00:02:42,050 and they are also very useful, 58 00:02:42,050 --> 00:02:46,090 but this time we're really going to use static methods. 59 00:02:46,090 --> 00:02:46,923 Okay. 60 00:02:47,850 --> 00:02:51,330 So again, these can be called on the model 61 00:02:51,330 --> 00:02:55,157 directly, for example, like this review.calcStats, 62 00:02:58,010 --> 00:02:59,520 okay. 63 00:02:59,520 --> 00:03:04,350 And the way this works is of course reviewSchema 64 00:03:04,350 --> 00:03:09,323 and then .statics and then the name of the function. 65 00:03:10,490 --> 00:03:11,540 So calcAverageRatings 66 00:03:18,360 --> 00:03:22,143 is equal to a function, which remember takes in a tour ID, 67 00:03:24,800 --> 00:03:27,180 and that ID is of course for the tour 68 00:03:27,180 --> 00:03:29,670 to which the current review belongs to. 69 00:03:29,670 --> 00:03:32,790 And I know that at this point it's probably all sounds 70 00:03:32,790 --> 00:03:35,000 kind of confusing, but don't worry 71 00:03:35,000 --> 00:03:36,720 once we have all of this implemented 72 00:03:36,720 --> 00:03:38,380 and also when we're testing it 73 00:03:38,380 --> 00:03:42,080 it will then make a lot of sense in practice, okay? 74 00:03:42,080 --> 00:03:45,120 Anyway in order to now actually do the calculation 75 00:03:45,120 --> 00:03:48,470 we will again use the aggregation pipeline, right. 76 00:03:48,470 --> 00:03:53,470 So let's remember that in our tool controller, 77 00:03:53,970 --> 00:03:56,990 so right here we use the aggregation pipeline 78 00:03:56,990 --> 00:04:00,730 to also create some statistics like this, okay. 79 00:04:00,730 --> 00:04:04,560 So we used the aggregate method, which we called directly 80 00:04:04,560 --> 00:04:06,670 on the model, okay. 81 00:04:06,670 --> 00:04:09,080 So now in our instance method we can actually do 82 00:04:09,080 --> 00:04:10,393 the exact same thing. 83 00:04:12,140 --> 00:04:15,690 So in a static method like this these keywords 84 00:04:15,690 --> 00:04:18,130 actually points to the current model. 85 00:04:18,130 --> 00:04:20,623 So that's why we can use this.aggregate, 86 00:04:22,160 --> 00:04:25,100 because remember we need to call this.aggregate 87 00:04:25,100 --> 00:04:27,470 on the model directly, and that's exactly 88 00:04:27,470 --> 00:04:30,970 why we're using a static method here in the first place. 89 00:04:30,970 --> 00:04:33,690 Because again this now points to the model 90 00:04:33,690 --> 00:04:38,200 and we need to call aggregate always on the model, okay. 91 00:04:38,200 --> 00:04:41,610 So into aggregate we need to pass in an array 92 00:04:41,610 --> 00:04:45,850 of all the stages that we want in aggregate, okay. 93 00:04:45,850 --> 00:04:47,930 So what do we want to do first? 94 00:04:47,930 --> 00:04:51,930 Well the first step should be to select all the reviews 95 00:04:51,930 --> 00:04:54,280 that actually belong to the current tour 96 00:04:54,280 --> 00:04:57,470 that was passed in as the argument. 97 00:04:57,470 --> 00:04:58,790 Okay. 98 00:04:58,790 --> 00:05:02,093 So our first stage is a match stage, 99 00:05:03,090 --> 00:05:03,933 remember that, 100 00:05:05,360 --> 00:05:07,580 and so in here we passed our filter object 101 00:05:08,620 --> 00:05:11,420 and we can say tour equal to tour, 102 00:05:11,420 --> 00:05:13,740 but we don't really need that, as you already know, 103 00:05:13,740 --> 00:05:17,950 and so let's just remove this part, or actually 104 00:05:17,950 --> 00:05:20,670 just to make it a bit less confusing here with the names 105 00:05:20,670 --> 00:05:24,290 let's call this one here tour ID, okay. 106 00:05:24,290 --> 00:05:26,620 So tourId in here, 107 00:05:26,620 --> 00:05:27,480 okay. 108 00:05:27,480 --> 00:05:29,510 So like this we only select a tour 109 00:05:29,510 --> 00:05:33,330 that we actually want to update, okay. 110 00:05:33,330 --> 00:05:35,740 Now in the next stage let's actually calculate 111 00:05:35,740 --> 00:05:37,930 the statistics themselves, 112 00:05:37,930 --> 00:05:41,033 and for that we use a group stage. 113 00:05:42,920 --> 00:05:44,900 And in the group phase remember 114 00:05:44,900 --> 00:05:49,900 the first field that we need to specify is the ID, so _id 115 00:05:50,240 --> 00:05:51,740 and then the common field 116 00:05:51,740 --> 00:05:53,570 that all of the documents have in common 117 00:05:53,570 --> 00:05:56,200 that we want to group by and so that's again 118 00:05:56,200 --> 00:05:57,543 going to be the tour. 119 00:06:00,230 --> 00:06:04,460 So just like in our previous statistic calculation example 120 00:06:04,460 --> 00:06:07,310 here we grouped by the difficulty. 121 00:06:07,310 --> 00:06:10,250 So like this we calculate the statistics for easy 122 00:06:10,250 --> 00:06:11,840 and statistics for medium 123 00:06:11,840 --> 00:06:14,560 and then statistics for difficult tours. 124 00:06:14,560 --> 00:06:17,140 So in this example, we grouped all the tours together 125 00:06:17,140 --> 00:06:18,453 by their difficulty, 126 00:06:19,450 --> 00:06:20,283 okay. 127 00:06:20,283 --> 00:06:22,810 But here, of course we're grouping all the tours together 128 00:06:22,810 --> 00:06:23,663 by tour. 129 00:06:25,440 --> 00:06:26,273 Great. 130 00:06:26,273 --> 00:06:28,023 Now the number of ratings, 131 00:06:31,290 --> 00:06:32,653 remember how we do that, 132 00:06:33,690 --> 00:06:35,970 so all we do is to basically add one 133 00:06:35,970 --> 00:06:37,970 for each tour that we have, 134 00:06:37,970 --> 00:06:41,570 so each tour that was matched in the previous step, okay. 135 00:06:41,570 --> 00:06:44,810 So if there are five review documents for the current tour 136 00:06:44,810 --> 00:06:48,310 then for each of these documents one will get added. 137 00:06:48,310 --> 00:06:51,310 So then in the end the number of ratings will be five, 138 00:06:51,310 --> 00:06:55,130 and again, because of course we have five review documents. 139 00:06:55,130 --> 00:06:57,083 So that makes sense, right? 140 00:06:58,532 --> 00:07:03,532 Then also the average rating, which just like before 141 00:07:03,970 --> 00:07:08,970 we use the average operator and this needs to be inside 142 00:07:09,180 --> 00:07:10,013 an object 143 00:07:12,490 --> 00:07:14,440 and in here the name of the field 144 00:07:15,470 --> 00:07:18,330 which is the rating, right. 145 00:07:18,330 --> 00:07:22,180 So remember how each review has a rating field. 146 00:07:22,180 --> 00:07:24,993 So that's where we want to calculate the average from. 147 00:07:27,720 --> 00:07:30,350 Okay, and that's actually it. 148 00:07:30,350 --> 00:07:32,950 So number and average of ratings 149 00:07:32,950 --> 00:07:36,790 is exactly what we wanted to calculate in this aggregation. 150 00:07:36,790 --> 00:07:39,740 Now keep in mind that this actually returns a promise 151 00:07:39,740 --> 00:07:43,290 and so we need to await that and then store it 152 00:07:43,290 --> 00:07:46,193 into a variable called stats. 153 00:07:49,070 --> 00:07:49,980 Okay. 154 00:07:49,980 --> 00:07:53,023 Then mark this one here as async as well, 155 00:07:54,600 --> 00:07:55,620 give it a save 156 00:07:55,620 --> 00:07:59,790 and so now we actually need to use that stats variable. 157 00:07:59,790 --> 00:08:02,930 For now all I really want to do just to test this 158 00:08:02,930 --> 00:08:06,073 is to actually log the statistics to the console. 159 00:08:08,120 --> 00:08:09,090 Console.log 160 00:08:10,600 --> 00:08:11,433 stats. 161 00:08:13,640 --> 00:08:16,880 Okay, then in the later step we will actually want to, 162 00:08:16,880 --> 00:08:19,950 as I mentioned before then update the tour document 163 00:08:19,950 --> 00:08:21,770 with these statistics, 164 00:08:21,770 --> 00:08:23,930 but I'm gonna leave that for a bit later, 165 00:08:23,930 --> 00:08:26,070 because for now we actually need to call 166 00:08:26,070 --> 00:08:28,390 this method here somewhere, because otherwise 167 00:08:28,390 --> 00:08:31,133 the statistics here will never get called. 168 00:08:32,100 --> 00:08:33,863 And remember how we said at the beginning 169 00:08:33,863 --> 00:08:36,159 that we will do this using middleware 170 00:08:36,159 --> 00:08:38,523 each time that a new review is created. 171 00:08:40,049 --> 00:08:44,250 So let's implement that using reviewSchema pre 172 00:08:45,330 --> 00:08:46,163 save 173 00:08:50,680 --> 00:08:54,563 and then just our normal regular middleware function here. 174 00:08:55,860 --> 00:08:57,873 And remember that in this kind of middleware 175 00:08:57,873 --> 00:09:00,093 that this keyword points to the document 176 00:09:00,093 --> 00:09:02,210 that is currently being saved. 177 00:09:02,210 --> 00:09:04,760 So this points to 178 00:09:06,540 --> 00:09:08,850 current review, okay. 179 00:09:08,850 --> 00:09:11,880 So we will want to call the calcAverageRating function 180 00:09:11,880 --> 00:09:15,020 using this.tour, right. 181 00:09:15,020 --> 00:09:18,770 Now how are we actually going to call this function? 182 00:09:18,770 --> 00:09:19,940 Remember how I said that 183 00:09:19,940 --> 00:09:22,470 this function is available on the model. 184 00:09:22,470 --> 00:09:25,050 So basically like this put 185 00:09:25,050 --> 00:09:27,390 review.calcAverageRatings 186 00:09:29,557 --> 00:09:32,550 and then as I said we want to use this.tour, 187 00:09:34,340 --> 00:09:35,173 okay. 188 00:09:35,173 --> 00:09:37,240 And again, because this is the current review 189 00:09:37,240 --> 00:09:40,340 and this is then the tour ID that we're gonna pass 190 00:09:40,340 --> 00:09:42,143 inside of the calcAverageRatings. 191 00:09:43,640 --> 00:09:46,950 Now the problem is that at this point here in the code 192 00:09:46,950 --> 00:09:50,200 the review variable is not yet defined. 193 00:09:50,200 --> 00:09:53,340 Now you might think that the simple solution would be to 194 00:09:53,340 --> 00:09:57,780 simply move this code in here after this review declaration, 195 00:09:57,780 --> 00:10:00,480 but unfortunately that's not going to work, 196 00:10:00,480 --> 00:10:03,630 because just like in Express this code here basically runs 197 00:10:03,630 --> 00:10:05,730 in the sequence it is declared. 198 00:10:05,730 --> 00:10:08,100 So if we were to put this code here 199 00:10:08,100 --> 00:10:11,550 after the review declaration then this reviewSchema here 200 00:10:11,550 --> 00:10:13,810 would not contain this middleware, 201 00:10:13,810 --> 00:10:16,050 because we would then only be declaring it 202 00:10:16,050 --> 00:10:19,750 after the review model was already created, okay, 203 00:10:19,750 --> 00:10:23,160 but there is fortunately still a way around this 204 00:10:23,160 --> 00:10:26,273 and that is to use this.constructor. 205 00:10:28,970 --> 00:10:31,640 So this here still points to the model. 206 00:10:31,640 --> 00:10:35,267 You know, basically again this is the current document 207 00:10:35,267 --> 00:10:38,030 and the constructor is basically the model 208 00:10:38,030 --> 00:10:40,470 who created that document. 209 00:10:40,470 --> 00:10:42,410 So this here stands for the tour 210 00:10:42,410 --> 00:10:45,823 and so we can then simply do it like this. 211 00:10:47,420 --> 00:10:52,043 Then call next as always and that's actually it. 212 00:10:54,130 --> 00:10:57,320 So let's now go ahead and test this. 213 00:10:57,320 --> 00:11:00,500 And for doing that I will create a new tour first, 214 00:11:00,500 --> 00:11:02,670 because the other ones that we already have 215 00:11:02,670 --> 00:11:04,620 they have the average and number of ratings 216 00:11:04,620 --> 00:11:06,730 already calculated and so we really 217 00:11:06,730 --> 00:11:10,240 want to start from scratch here when testing this out. 218 00:11:10,240 --> 00:11:13,270 So to create a new tour we need to be logged in 219 00:11:13,270 --> 00:11:16,840 as administrators, and I think we currently are, 220 00:11:16,840 --> 00:11:18,940 but just to make sure let's do that again. 221 00:11:20,400 --> 00:11:21,233 Okay. 222 00:11:22,660 --> 00:11:24,981 So this is the new test tour. 223 00:11:24,981 --> 00:11:28,313 All right let's remove these here, they are not mandatory, 224 00:11:30,120 --> 00:11:32,663 and I think with this we're good to go. 225 00:11:36,950 --> 00:11:40,580 All right, and here you see the defaults that we set before 226 00:11:40,580 --> 00:11:43,130 so the ratings average for five 227 00:11:43,130 --> 00:11:46,430 and the quantity set to zero, okay. 228 00:11:46,430 --> 00:11:49,630 Now in order to create a new review 229 00:11:49,630 --> 00:11:52,560 we actually need to be logged in as a regular user, 230 00:11:52,560 --> 00:11:54,033 so not an administrator. 231 00:11:54,900 --> 00:11:58,900 So let's get a normal user, let's say. 232 00:11:58,900 --> 00:12:02,120 So let's just use this Laura here. 233 00:12:02,120 --> 00:12:03,470 So Laura@example.com 234 00:12:04,804 --> 00:12:08,063 and as I mentioned earlier the password is always the same. 235 00:12:12,000 --> 00:12:16,773 So let's do that and now we will create new review on tour. 236 00:12:17,920 --> 00:12:21,103 So now let's get the tour that we created earlier, 237 00:12:22,890 --> 00:12:26,653 so this ID and put it here in the URL. 238 00:12:27,880 --> 00:12:30,490 Okay, and so remember that this route 239 00:12:30,490 --> 00:12:33,877 now automatically gets a tour ID from the URL 240 00:12:33,877 --> 00:12:37,413 and a user ID from the currently logged in user, 241 00:12:38,730 --> 00:12:39,563 okay. 242 00:12:39,563 --> 00:12:42,063 So let's use this one as the first rating, 243 00:12:44,490 --> 00:12:48,643 let's send it, and now I want to take a look at our console. 244 00:12:50,060 --> 00:12:53,230 We have an output here, but for some reason it's only 245 00:12:53,230 --> 00:12:55,260 like this empty array. 246 00:12:55,260 --> 00:12:58,010 So something must not be working here. 247 00:12:58,010 --> 00:13:02,400 So let's take a look at the tour ID here just to make sure 248 00:13:02,400 --> 00:13:07,200 that we're getting the right value here, ID 249 00:13:07,200 --> 00:13:09,340 and let's also comment out this part here 250 00:13:10,210 --> 00:13:14,220 just to see if maybe there's some error in this part, 251 00:13:14,220 --> 00:13:17,360 and so let's now try it again. 252 00:13:17,360 --> 00:13:20,113 I'll simply add the same one here again, okay. 253 00:13:23,680 --> 00:13:26,453 Okay, so now we actually get something. 254 00:13:27,310 --> 00:13:29,790 So we have this one review which is 255 00:13:29,790 --> 00:13:32,210 the one that we created initially. 256 00:13:32,210 --> 00:13:34,900 So it starts with this ac15, 257 00:13:34,900 --> 00:13:39,623 but the one that I just created is this 66d, okay. 258 00:13:39,623 --> 00:13:44,223 So let's take a look at that here in Compass. 259 00:13:45,490 --> 00:13:47,223 So we need to go to the last page. 260 00:13:49,380 --> 00:13:52,450 Okay, and so the one that shows up in our console 261 00:13:52,450 --> 00:13:55,270 is only this one here, but not the second one 262 00:13:55,270 --> 00:13:57,730 that we just created, okay. 263 00:13:57,730 --> 00:13:59,670 So if we now create a third one 264 00:13:59,670 --> 00:14:02,980 then we should probably see the first and the second one. 265 00:14:02,980 --> 00:14:03,880 So let's try that. 266 00:14:12,060 --> 00:14:13,160 Okay. 267 00:14:13,160 --> 00:14:16,290 Send this one and now here in our output 268 00:14:18,060 --> 00:14:20,830 I actually get all three of them. 269 00:14:20,830 --> 00:14:23,793 So that doesn't make much sense, 270 00:14:24,800 --> 00:14:27,443 but anyway the point that I wanted to make here 271 00:14:27,443 --> 00:14:29,700 is that we shouldn't use pre, 272 00:14:29,700 --> 00:14:33,560 but instead we should use the post save middleware, okay. 273 00:14:33,560 --> 00:14:35,520 And that's because at pre save 274 00:14:35,520 --> 00:14:37,350 the current review is not really 275 00:14:37,350 --> 00:14:39,270 in the collection just yet. 276 00:14:39,270 --> 00:14:42,420 So therefore, when we then do this match here 277 00:14:42,420 --> 00:14:45,170 it shouldn't be able to then appear in the output here, 278 00:14:45,170 --> 00:14:47,150 because again at this point in time 279 00:14:47,150 --> 00:14:51,000 it's not really saved into the collection just yet, okay. 280 00:14:51,000 --> 00:14:52,760 So it's best to use post here, 281 00:14:52,760 --> 00:14:54,770 because at that time, of course, 282 00:14:54,770 --> 00:14:57,820 all the documents are already saved in the database 283 00:14:57,820 --> 00:14:59,330 and so that's then a great time 284 00:14:59,330 --> 00:15:02,430 to actually do this calculation with all the reviews already 285 00:15:02,430 --> 00:15:04,723 and then store the result on the tour. 286 00:15:05,940 --> 00:15:07,750 Okay, so I'm not really sure 287 00:15:07,750 --> 00:15:10,403 why this one here actually showed up at this point, 288 00:15:11,670 --> 00:15:15,603 but anyway let's now try it with another one. 289 00:15:19,290 --> 00:15:21,280 So that's the fourth one, 290 00:15:21,280 --> 00:15:25,450 and now we get next is not a function and indeed 291 00:15:25,450 --> 00:15:27,930 as I mentioned earlier the post middleware 292 00:15:27,930 --> 00:15:30,250 does not get access to next 293 00:15:30,250 --> 00:15:33,940 and so therefore, we of course cannot call it, 294 00:15:33,940 --> 00:15:34,833 cannot use it. 295 00:15:37,070 --> 00:15:40,793 All right, and so here we have our next rating, 296 00:15:42,160 --> 00:15:42,993 okay. 297 00:15:42,993 --> 00:15:45,913 So it now shows up here as well. 298 00:15:48,090 --> 00:15:50,840 So we don't need that and now we can safely 299 00:15:50,840 --> 00:15:53,053 try to calculate our statistics here. 300 00:15:54,140 --> 00:15:56,600 Give it a save, and actually let's 301 00:15:56,600 --> 00:15:59,000 delete all of these reviews. 302 00:15:59,000 --> 00:16:03,623 So I basically want to start from scratch, okay. 303 00:16:04,880 --> 00:16:05,800 So 304 00:16:08,320 --> 00:16:11,190 all of these five reviews here should go 305 00:16:16,300 --> 00:16:18,450 and now we're ready to go. 306 00:16:18,450 --> 00:16:21,030 So let's actually create this one as the first one 307 00:16:22,860 --> 00:16:26,400 and now let's go ahead and take a look at our statistics 308 00:16:26,400 --> 00:16:27,600 and here we go. 309 00:16:27,600 --> 00:16:29,530 So this is the current tour ID 310 00:16:29,530 --> 00:16:31,670 then the number of ratings is one 311 00:16:31,670 --> 00:16:33,703 and the average is of course three. 312 00:16:35,510 --> 00:16:39,240 So if we add another one with the rating of five 313 00:16:40,920 --> 00:16:43,310 well then the average should be four 314 00:16:43,310 --> 00:16:46,010 and we should have the number of ratings equal to two. 315 00:16:47,840 --> 00:16:52,460 So let's try that and indeed just as I said 316 00:16:52,460 --> 00:16:55,480 two ratings, average of four. 317 00:16:55,480 --> 00:16:59,010 And just another one just to make really sure, 318 00:16:59,010 --> 00:17:00,610 let's add another one with five, 319 00:17:05,599 --> 00:17:07,240 and here we go. 320 00:17:07,240 --> 00:17:08,073 Great. 321 00:17:08,073 --> 00:17:10,990 So we're now correctly calculating the statistics, 322 00:17:10,990 --> 00:17:13,089 but of course they're not yet being persisted 323 00:17:13,089 --> 00:17:15,290 to the current tour document. 324 00:17:15,290 --> 00:17:18,630 So if we come here in Compass 325 00:17:18,630 --> 00:17:20,292 to the tour that we just created, 326 00:17:22,329 --> 00:17:24,339 probably it's the last one here. 327 00:17:24,339 --> 00:17:27,790 Yep, so our test tour, it still has these default values 328 00:17:27,790 --> 00:17:30,470 of 4.5 and zero, 329 00:17:30,470 --> 00:17:31,350 okay. 330 00:17:31,350 --> 00:17:33,260 So now it's time to actually persist 331 00:17:33,260 --> 00:17:36,573 the calculated statistics into this tour document, 332 00:17:38,250 --> 00:17:39,480 okay. 333 00:17:39,480 --> 00:17:41,670 And so let's do that. 334 00:17:41,670 --> 00:17:44,420 First of all, in order to be able to do that 335 00:17:44,420 --> 00:17:47,863 we need to require the tour model, right. 336 00:17:48,810 --> 00:17:49,643 So tour 337 00:17:51,620 --> 00:17:52,453 require 338 00:17:55,250 --> 00:17:56,483 and there we go. 339 00:18:03,860 --> 00:18:07,010 So what we need to do is to basically find 340 00:18:07,010 --> 00:18:10,160 the current tour and then update it. 341 00:18:10,160 --> 00:18:13,873 So we did that before many times, findById 342 00:18:14,830 --> 00:18:16,980 and update, 343 00:18:16,980 --> 00:18:17,813 okay. 344 00:18:17,813 --> 00:18:21,370 And the ID is of course the tour ID that was passed in 345 00:18:21,370 --> 00:18:23,670 into the function and then an object 346 00:18:23,670 --> 00:18:27,140 of the data that we actually want to update. 347 00:18:27,140 --> 00:18:30,470 So let's get these field names from here. 348 00:18:30,470 --> 00:18:32,500 So we have ratingsQuantity 349 00:18:34,970 --> 00:18:36,230 on one hand. 350 00:18:36,230 --> 00:18:39,260 Let's put it here to one for now 351 00:18:39,260 --> 00:18:41,240 just so we don't get an error 352 00:18:41,240 --> 00:18:42,893 and ratingsAverage. 353 00:18:46,910 --> 00:18:48,940 Again, to prevent any errors, 354 00:18:48,940 --> 00:18:50,650 because now I want to come here 355 00:18:50,650 --> 00:18:53,400 and take a look at these statistics. 356 00:18:53,400 --> 00:18:57,700 So you see they are stored in an array actually, okay. 357 00:18:57,700 --> 00:19:00,870 So we need to go to the first position of that array, 358 00:19:00,870 --> 00:19:02,433 which is where this object is. 359 00:19:04,520 --> 00:19:07,060 So stats at position zero 360 00:19:07,970 --> 00:19:12,820 and then from there we get the end rating property, 361 00:19:12,820 --> 00:19:13,653 okay. 362 00:19:13,653 --> 00:19:14,593 So this one here. 363 00:19:18,440 --> 00:19:21,283 And then of course the same for average rating. 364 00:19:23,870 --> 00:19:24,800 Okay. 365 00:19:24,800 --> 00:19:27,070 And now we also need to await it. 366 00:19:27,070 --> 00:19:31,640 So as always this returns a premise and so we can await it. 367 00:19:31,640 --> 00:19:34,750 Now we could also store the result of this to a variable, 368 00:19:34,750 --> 00:19:37,250 but we don't really need the tour at all. 369 00:19:37,250 --> 00:19:39,530 All we want to do is to really update it, 370 00:19:39,530 --> 00:19:40,880 and so we do not store 371 00:19:40,880 --> 00:19:43,700 the results value of the premise anywhere. 372 00:19:43,700 --> 00:19:44,960 Okay. 373 00:19:44,960 --> 00:19:49,960 So let's simply try to add another review here, 374 00:19:50,050 --> 00:19:53,373 this time with one terrible. 375 00:19:55,800 --> 00:19:56,810 Okay. 376 00:19:56,810 --> 00:20:00,650 And first of all, let's take a look at the statistics. 377 00:20:00,650 --> 00:20:03,300 So of course, we get the rating of four, 378 00:20:03,300 --> 00:20:06,203 so the number of ratings, and the average of 3.5. 379 00:20:07,270 --> 00:20:10,090 So now in order to really see if it worked 380 00:20:10,090 --> 00:20:13,290 let's check out Compass or we can also use 381 00:20:13,290 --> 00:20:15,223 or get tour end point, 382 00:20:16,270 --> 00:20:17,320 okay. 383 00:20:17,320 --> 00:20:20,593 So we need the tour ID, that we can copy from here, 384 00:20:23,550 --> 00:20:27,160 paste it here, and now comes the moment 385 00:20:27,160 --> 00:20:30,060 and indeed it worked, 386 00:20:30,060 --> 00:20:31,110 perfect. 387 00:20:31,110 --> 00:20:34,940 So that's awesome, absolutely fantastic. 388 00:20:34,940 --> 00:20:37,810 Just one more time for the fun of it 389 00:20:37,810 --> 00:20:39,893 let's add another review here. 390 00:20:44,330 --> 00:20:45,163 Okay. 391 00:20:45,163 --> 00:20:48,480 Update this one, and so now we get five 392 00:20:48,480 --> 00:20:51,760 and our average went up by a little bit. 393 00:20:51,760 --> 00:20:52,593 Great. 394 00:20:52,593 --> 00:20:56,570 So let's now just take a second and recap what we did here. 395 00:20:56,570 --> 00:20:59,690 So we started by creating a static method. 396 00:20:59,690 --> 00:21:01,770 So this entire function here 397 00:21:01,770 --> 00:21:04,870 to basically create the statistics of the average 398 00:21:04,870 --> 00:21:07,980 and number of ratings for the tour ID 399 00:21:07,980 --> 00:21:12,230 for which the current review was created, okay. 400 00:21:12,230 --> 00:21:14,870 And we created this function as a static method, 401 00:21:14,870 --> 00:21:18,030 because we needed to call the aggregate function 402 00:21:18,030 --> 00:21:19,310 on the model. 403 00:21:19,310 --> 00:21:22,080 So in a static method to this variable 404 00:21:22,080 --> 00:21:23,910 calls exactly to a method. 405 00:21:23,910 --> 00:21:26,670 So it's very handy in these cases. 406 00:21:26,670 --> 00:21:29,930 So we constructed our aggregation pipeline here 407 00:21:29,930 --> 00:21:32,590 where we selected all the reviews that matched 408 00:21:32,590 --> 00:21:35,880 the current tour ID, and then they're calculated, 409 00:21:35,880 --> 00:21:38,470 the statistics for all of these reviews. 410 00:21:38,470 --> 00:21:40,520 Then after that was done 411 00:21:40,520 --> 00:21:45,470 we saved the statistics to the current tour, okay. 412 00:21:45,470 --> 00:21:47,690 Then in order to actually use this function 413 00:21:47,690 --> 00:21:52,570 we call it after a new review has been created, okay. 414 00:21:52,570 --> 00:21:55,620 For that we need to use this.constructor 415 00:21:55,620 --> 00:21:58,930 because this is what points to the current model. 416 00:21:58,930 --> 00:22:02,037 Now keep in mind how we said that we also want to update 417 00:22:02,037 --> 00:22:06,350 the statistics whenever a review is edited or deleted, 418 00:22:06,350 --> 00:22:08,090 because these actions will, of course, 419 00:22:08,090 --> 00:22:11,210 also influence the number and the average. 420 00:22:11,210 --> 00:22:13,960 However, doing so is a bit more complex. 421 00:22:13,960 --> 00:22:18,140 So since this video is already running pretty long 422 00:22:18,140 --> 00:22:20,493 let's actually leave that to the next one. 32762

Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.