1 00:00:01,210 --> 00:00:03,670 Let's now keep working on our API. 2 00:00:04,530 --> 00:00:06,620 Over the next videos, we will implement 3 00:00:06,620 --> 00:00:08,840 a couple of common API features 4 00:00:08,840 --> 00:00:12,440 that make an API easier and more pleasant to use 5 00:00:12,440 --> 00:00:14,950 for whomever is gonna use it. 6 00:00:14,950 --> 00:00:15,940 And in this lecture, 7 00:00:15,940 --> 00:00:17,963 we're gonna start with filtering. 8 00:00:19,340 --> 00:00:22,830 So again, the first feature that we're gonna implement 9 00:00:22,830 --> 00:00:26,000 is to allow the user to basically filter data 10 00:00:26,000 --> 00:00:27,563 using a query string. 11 00:00:28,890 --> 00:00:32,233 Let me just tell you what a query string is using Postman. 12 00:00:36,610 --> 00:00:39,993 So, let's close all these guys. 13 00:00:46,150 --> 00:00:47,683 Alright. 14 00:00:47,683 --> 00:00:50,350 Actually where filtering is gonna make sense 15 00:00:50,350 --> 00:00:52,793 is here on this get all tours route. 16 00:00:53,750 --> 00:00:55,940 Because, this is the one that, 17 00:00:55,940 --> 00:00:58,720 well as the name says, gets all the tours. 18 00:00:58,720 --> 00:01:02,370 And so here, we want to allow the user to filter the data, 19 00:01:02,370 --> 00:01:04,840 so that instead of getting all the data, 20 00:01:04,840 --> 00:01:08,123 he only gets the data that matches the filter. 21 00:01:09,340 --> 00:01:12,290 Like this, we can basically allow the user 22 00:01:12,290 --> 00:01:14,750 to query the data in a very easy way. 23 00:01:14,750 --> 00:01:16,480 Again, using the query string. 24 00:01:16,480 --> 00:01:18,850 And the query string looks a bit like this. 25 00:01:18,850 --> 00:01:20,340 And I'm sure you've seen it. 26 00:01:20,340 --> 00:01:23,120 So we start with a question mark, 27 00:01:23,120 --> 00:01:26,663 and then we can simply specify some field value pairs. 28 00:01:28,420 --> 00:01:30,360 So let's say we wanted to filter 29 00:01:30,360 --> 00:01:33,620 for a duration equal to five and 30 00:01:33,620 --> 00:01:36,573 at the same time, a difficulty of easy. 31 00:01:40,500 --> 00:01:44,690 So we can very simply build a query string like this. 32 00:01:44,690 --> 00:01:46,860 So again, it starts with this question mark, 33 00:01:46,860 --> 00:01:48,800 and then we can specify as many 34 00:01:48,800 --> 00:01:51,723 key value pairs using this format. 35 00:01:53,000 --> 00:01:54,860 And now our Postman application here 36 00:01:54,860 --> 00:01:57,450 actually recognizes this and basically 37 00:01:57,450 --> 00:02:00,420 parses this string here and puts the key and 38 00:02:00,420 --> 00:02:04,140 the values down here in this Params tab. 39 00:02:04,140 --> 00:02:06,963 So we could also specify the key and values here. 40 00:02:07,890 --> 00:02:11,110 So lets say test, set it to twenty three, and 41 00:02:11,110 --> 00:02:12,690 so you see up here that it actually 42 00:02:12,690 --> 00:02:14,483 added it to the query string. 43 00:02:15,370 --> 00:02:18,740 So that's a very nice way of Postman helping us here. 44 00:02:18,740 --> 00:02:21,150 Because now we can, for example, while we're 45 00:02:21,150 --> 00:02:24,260 doing testing we can turn these on and off 46 00:02:24,260 --> 00:02:25,610 and you see that the query string 47 00:02:25,610 --> 00:02:27,573 in here reacts accordingly. 48 00:02:28,970 --> 00:02:32,940 Anyway, we now need a way of accessing this data 49 00:02:32,940 --> 00:02:35,883 that's in a query string, in our Express application. 50 00:02:36,730 --> 00:02:39,210 But, luckily for us, that's very easy, 51 00:02:39,210 --> 00:02:42,260 because Express already took care of that. 52 00:02:42,260 --> 00:02:44,690 So that's just one of the many many things 53 00:02:44,690 --> 00:02:48,420 that Express does for us in order to really make 54 00:02:48,420 --> 00:02:50,563 NodeJS development a lot faster. 55 00:02:52,420 --> 00:02:55,170 So let me show it to you here, actually in the console. 56 00:02:57,810 --> 00:03:01,380 So this data is on a request, which makes sense, 57 00:03:01,380 --> 00:03:04,013 and then it is in a field called query. 58 00:03:04,980 --> 00:03:07,490 So request dot query should then give us 59 00:03:07,490 --> 00:03:10,630 an object nicely formatted with the data 60 00:03:10,630 --> 00:03:11,730 from the query string. 61 00:03:12,760 --> 00:03:13,593 Give it a save. 62 00:03:14,530 --> 00:03:16,630 And note, how I actually added it to 63 00:03:16,630 --> 00:03:20,150 the get all tours handler function. 64 00:03:20,150 --> 00:03:22,800 So again, we do this kind of filtering 65 00:03:22,800 --> 00:03:25,323 in the route where we want to get all the tours. 66 00:03:27,140 --> 00:03:30,373 Let's test it out now with this exact query string. 67 00:03:31,400 --> 00:03:32,920 Sent the request. 68 00:03:32,920 --> 00:03:36,333 And coming back, here we got the object. 69 00:03:37,170 --> 00:03:40,420 Let's actually make this here bigger 70 00:03:40,420 --> 00:03:41,720 so you can see. 71 00:03:41,720 --> 00:03:43,650 That's not really working. 72 00:03:43,650 --> 00:03:45,820 So sometimes I know some people cannot see 73 00:03:45,820 --> 00:03:47,630 the bottom of the screen. 74 00:03:47,630 --> 00:03:49,080 Let me just do it again here. 75 00:03:51,280 --> 00:03:52,942 And so, here we go. 76 00:03:52,942 --> 00:03:55,990 We have the object, which has the duration set to five 77 00:03:55,990 --> 00:03:58,200 and the difficulty set to easy. 78 00:03:58,200 --> 00:04:00,460 And so you see that Express, very nicely, 79 00:04:00,460 --> 00:04:04,250 parsed that string into this, easy to use, object. 80 00:04:04,250 --> 00:04:06,330 Now one thing that I noticed here is that 81 00:04:06,330 --> 00:04:08,380 we're actually missing the log that we had 82 00:04:08,380 --> 00:04:10,440 easier here in the console. 83 00:04:10,440 --> 00:04:12,540 Let's take a look at why that's happening. 84 00:04:15,431 --> 00:04:18,430 So for some reason, we now have the application 85 00:04:18,430 --> 00:04:21,310 before we actually read the environment variable. 86 00:04:21,310 --> 00:04:24,113 That way, the application does not get access to them. 87 00:04:25,010 --> 00:04:27,600 I thought that I had fixed this before, 88 00:04:27,600 --> 00:04:29,300 but for some reason it's back now. 89 00:04:30,340 --> 00:04:32,390 Give it another save here. 90 00:04:32,390 --> 00:04:33,690 And I will try that again. 91 00:04:36,180 --> 00:04:38,933 Now we get our logging back. 92 00:04:40,200 --> 00:04:43,750 A get request to this URL and then with 93 00:04:43,750 --> 00:04:45,963 this rest of the data here. 94 00:04:48,260 --> 00:04:50,600 Anyway, let's now actually use that data 95 00:04:50,600 --> 00:04:53,200 in order to implement our filtering. 96 00:04:53,200 --> 00:04:55,840 But before we can do that, I need to tell you that 97 00:04:55,840 --> 00:04:58,440 in Mongoose, there are actually two ways of 98 00:04:58,440 --> 00:05:00,120 writing database queries. 99 00:05:00,120 --> 00:05:03,050 The first one is to just use filter object 100 00:05:03,050 --> 00:05:06,490 just like we did in the MongoDB introduction section. 101 00:05:06,490 --> 00:05:08,690 Right? Remember that? 102 00:05:08,690 --> 00:05:12,333 The second way is to use some special Mongoose methods. 103 00:05:13,590 --> 00:05:16,505 Let me just, very quickly, show that to you. 104 00:05:16,505 --> 00:05:19,420 With the filter object, we would do it like this. 105 00:05:19,420 --> 00:05:21,910 We start with the find here, and then in there 106 00:05:21,910 --> 00:05:23,570 we can pass a filter object. 107 00:05:23,570 --> 00:05:25,900 And I already mentioned that before. 108 00:05:25,900 --> 00:05:28,410 Again, it works the exact same way as 109 00:05:28,410 --> 00:05:30,650 with a normal MongoDB query. 110 00:05:30,650 --> 00:05:33,160 We could now say, duration 111 00:05:34,570 --> 00:05:35,657 set it to five. 112 00:05:35,657 --> 00:05:36,663 And then, 113 00:05:39,320 --> 00:05:42,253 difficulty, set it to easy. 114 00:05:44,300 --> 00:05:47,150 That's exactly the query string we had before, 115 00:05:47,150 --> 00:05:48,960 and now I'm hard coding it here just to 116 00:05:48,960 --> 00:05:50,860 show you the two different ways of 117 00:05:50,860 --> 00:05:52,423 writing queries in Mongoose. 118 00:05:53,318 --> 00:05:54,518 Let's test this one out. 119 00:05:58,220 --> 00:06:00,453 You see that now, we only get two results. 120 00:06:01,290 --> 00:06:03,193 Let's give ourselves some space here. 121 00:06:04,810 --> 00:06:05,760 Alright. 122 00:06:05,760 --> 00:06:08,870 We see the two results and indeed 123 00:06:08,870 --> 00:06:10,890 they both have a duration of five, 124 00:06:10,890 --> 00:06:15,890 so here and here, and they both are easy. 125 00:06:15,930 --> 00:06:17,443 Easy and easy. 126 00:06:18,350 --> 00:06:20,563 So our filter worked just fine. 127 00:06:21,675 --> 00:06:24,710 That is the first way of writing a query. 128 00:06:24,710 --> 00:06:27,650 Just the normal way that we're already used to, 129 00:06:27,650 --> 00:06:29,103 but there is another way. 130 00:06:30,790 --> 00:06:32,993 Let me show that to you as well. 131 00:06:37,570 --> 00:06:39,910 Again, we start in the exact same way, 132 00:06:39,910 --> 00:06:41,690 but then the difference is that we start 133 00:06:41,690 --> 00:06:44,150 chaining some special Mongoose method to 134 00:06:44,150 --> 00:06:47,523 basically build the query similar to this one that we have. 135 00:06:49,540 --> 00:06:50,563 So we say, 136 00:06:51,730 --> 00:06:52,563 where 137 00:06:54,910 --> 00:06:55,780 the duration 138 00:06:58,840 --> 00:07:00,343 equals five. 139 00:07:01,810 --> 00:07:03,630 Then also, where 140 00:07:04,710 --> 00:07:06,180 the difficulty, 141 00:07:06,180 --> 00:07:08,023 that needs to be in quotes, 142 00:07:11,420 --> 00:07:12,253 equals 143 00:07:13,170 --> 00:07:14,003 easy. 144 00:07:17,270 --> 00:07:19,620 This query here is gonna be exactly 145 00:07:19,620 --> 00:07:22,500 the same as this one, but again, written using 146 00:07:22,500 --> 00:07:24,740 special Mongoose methods. 147 00:07:24,740 --> 00:07:27,240 And there are of course tons of other methods. 148 00:07:27,240 --> 00:07:30,980 For example, instead of equals, we can have less than, 149 00:07:30,980 --> 00:07:34,060 or equal, or just less than, or you can also 150 00:07:34,060 --> 00:07:37,520 sort the results or limit the number of results, 151 00:07:37,520 --> 00:07:39,020 and really all kinds of stuff. 152 00:07:41,057 --> 00:07:43,180 For sure, we're gonna use some of them 153 00:07:43,180 --> 00:07:44,743 over the next couple of videos. 154 00:07:46,050 --> 00:07:48,290 This might look a bit weird here to you, 155 00:07:48,290 --> 00:07:51,303 but its actually very, very useful in some cases. 156 00:07:52,530 --> 00:07:55,573 Just to test, give it a try again to this one. 157 00:07:57,010 --> 00:07:59,953 And indeed we get our same two results. 158 00:08:02,735 --> 00:08:04,590 Now, let me comment this one here out. 159 00:08:04,590 --> 00:08:06,950 I'm gonna leave it here just as a reference, 160 00:08:06,950 --> 00:08:10,300 because right now, we're gonna use this method here. 161 00:08:10,300 --> 00:08:12,400 And we're gonna use it, because in fact, 162 00:08:12,400 --> 00:08:15,000 we actually already have an object that 163 00:08:15,000 --> 00:08:16,363 looks a lot like this. 164 00:08:17,360 --> 00:08:20,300 And that is request dot query. 165 00:08:20,300 --> 00:08:22,193 If you compare it, this object, 166 00:08:23,228 --> 00:08:25,128 to this object that you see down here, 167 00:08:26,280 --> 00:08:28,173 looks exactly the same as this one. 168 00:08:30,120 --> 00:08:32,130 To implement a very simple filter, 169 00:08:32,130 --> 00:08:37,130 all we have to do in this case is to say, req dot query. 170 00:08:37,150 --> 00:08:38,793 Let's try that one more time. 171 00:08:39,730 --> 00:08:40,803 Get rid of this here. 172 00:08:42,650 --> 00:08:46,300 And indeed we get the exact same two results. 173 00:08:46,300 --> 00:08:50,223 Now let's just try only with difficulty set to easy. 174 00:08:52,140 --> 00:08:53,993 Now we get four results. 175 00:08:55,280 --> 00:08:56,700 All of them of course will have 176 00:08:56,700 --> 00:08:58,463 the difficulty set to easy. 177 00:09:00,540 --> 00:09:03,100 Our filter, our very basic filter, 178 00:09:03,100 --> 00:09:04,880 is now actually working. 179 00:09:04,880 --> 00:09:06,870 Now, the problem with this implementation, 180 00:09:06,870 --> 00:09:09,650 is that its actually way too simple. 181 00:09:09,650 --> 00:09:11,690 That's because, later on, we will have 182 00:09:11,690 --> 00:09:13,370 other query parameters. 183 00:09:13,370 --> 00:09:16,730 For example, sort, for sorting functionality, 184 00:09:16,730 --> 00:09:18,653 or page, for pagination. 185 00:09:19,610 --> 00:09:21,040 We need to make sure that we are 186 00:09:21,040 --> 00:09:24,180 not querying for these in our database. 187 00:09:24,180 --> 00:09:25,883 For example, if we added here, 188 00:09:27,360 --> 00:09:29,893 page, equal to two, 189 00:09:30,970 --> 00:09:33,993 then we would, of course, not get any result. 190 00:09:35,130 --> 00:09:36,300 Let me show that to you. 191 00:09:36,300 --> 00:09:38,280 And indeed we do not get any result, 192 00:09:38,280 --> 00:09:40,560 because there is no document in this collection 193 00:09:40,560 --> 00:09:42,593 where page is set to two. 194 00:09:43,480 --> 00:09:46,200 We only want to use this parameter here, 195 00:09:46,200 --> 00:09:49,170 or this field, page, to implement pagination 196 00:09:49,170 --> 00:09:51,593 and not to actually query in the database. 197 00:09:53,450 --> 00:09:54,870 So what we will have to do is, 198 00:09:54,870 --> 00:09:57,810 to basically exclude these special field names 199 00:09:57,810 --> 00:10:00,883 from our query string before we actually do the filtering. 200 00:10:02,680 --> 00:10:05,540 Let's now go ahead and implement that. 201 00:10:05,540 --> 00:10:08,200 What we will do is, to first, create a 202 00:10:08,200 --> 00:10:12,333 shallow copy of the request dot query object. 203 00:10:15,690 --> 00:10:17,670 Let's call it query object. 204 00:10:17,670 --> 00:10:20,030 Here we need, really, a hard copy. 205 00:10:20,030 --> 00:10:23,560 We can't just do, request dot query, 206 00:10:23,560 --> 00:10:25,570 because then, if you would delete something 207 00:10:25,570 --> 00:10:28,030 from this object, we would also delete it 208 00:10:28,030 --> 00:10:30,700 from the req dot query object. 209 00:10:30,700 --> 00:10:32,170 And that's because in JavaScript, 210 00:10:32,170 --> 00:10:35,260 when we set a variable to another object, 211 00:10:35,260 --> 00:10:37,490 that new variable will basically just be 212 00:10:37,490 --> 00:10:39,683 a reference to that original object. 213 00:10:41,030 --> 00:10:43,770 So we really need a hard copy here. 214 00:10:43,770 --> 00:10:46,310 In JavaScript, there's not really a built-in way 215 00:10:46,310 --> 00:10:49,020 of doing this, but a very nice trick that we can use, 216 00:10:49,020 --> 00:10:53,520 since ES6, is to use, first, the structuring 217 00:10:53,520 --> 00:10:55,960 which we use by using dot dot dot. 218 00:10:55,960 --> 00:10:58,270 And then we can simply create a 219 00:10:58,270 --> 00:10:59,663 new object out of that. 220 00:11:01,290 --> 00:11:02,123 Just like this. 221 00:11:03,260 --> 00:11:05,420 This structuring here, these three dots, 222 00:11:05,420 --> 00:11:08,683 will basically take all the fields out of the object. 223 00:11:09,860 --> 00:11:11,810 Here with the curly braces, well, 224 00:11:11,810 --> 00:11:13,990 we simply create a new object. 225 00:11:13,990 --> 00:11:15,940 So we have a new object that is basically 226 00:11:15,940 --> 00:11:18,070 going to contain all the key value pairs 227 00:11:18,070 --> 00:11:21,053 that were in our req dot query object. 228 00:11:23,020 --> 00:11:24,330 So that's a copy. 229 00:11:24,330 --> 00:11:26,450 Now let's create an array of 230 00:11:26,450 --> 00:11:28,633 all the fields that we want to exclude. 231 00:11:31,610 --> 00:11:34,040 I'm calling that one excluded fields. 232 00:11:34,040 --> 00:11:37,090 And then we want to exclude page, 233 00:11:37,090 --> 00:11:38,400 so that's the one that I just 234 00:11:38,400 --> 00:11:40,250 told you before in Postman. 235 00:11:40,250 --> 00:11:42,150 Then, we also want to exclude 236 00:11:43,170 --> 00:11:44,440 sort, 237 00:11:44,440 --> 00:11:46,053 we want to exclude limit, 238 00:11:47,890 --> 00:11:50,533 and we want to exclude fields. 239 00:11:52,160 --> 00:11:54,940 We will implement all of the functionality 240 00:11:54,940 --> 00:11:58,210 of paging, sorting, limiting, and selecting 241 00:11:58,210 --> 00:12:01,140 only some specific fields, later 242 00:12:01,140 --> 00:12:02,690 over the next couple of videos. 243 00:12:03,750 --> 00:12:05,900 Next, what we need to do is to 244 00:12:05,900 --> 00:12:08,610 basically remove all of these fields 245 00:12:08,610 --> 00:12:10,230 from our query object. 246 00:12:10,230 --> 00:12:11,690 And in order to do that, we will 247 00:12:11,690 --> 00:12:13,523 loop over these fields. 248 00:12:14,660 --> 00:12:15,860 So, excluded fields 249 00:12:17,690 --> 00:12:19,070 for each. 250 00:12:19,070 --> 00:12:20,390 And we're using for each because 251 00:12:20,390 --> 00:12:22,423 we don't want to save a new array. 252 00:12:24,150 --> 00:12:25,840 Then each of these of elements, 253 00:12:25,840 --> 00:12:27,863 we can use the delete operator. 254 00:12:30,930 --> 00:12:32,530 And then from the query object, 255 00:12:32,530 --> 00:12:34,730 we want to delete the field with 256 00:12:34,730 --> 00:12:36,700 the name of element, so the current 257 00:12:36,700 --> 00:12:38,820 element in the array. 258 00:12:38,820 --> 00:12:42,340 Like this, we will first delete the field of page, 259 00:12:42,340 --> 00:12:45,563 then the sort, then the limit, then the fields. 260 00:12:46,560 --> 00:12:48,440 Of course, only in case if its there. 261 00:12:48,440 --> 00:12:50,860 If there is, for example, no limit field, 262 00:12:50,860 --> 00:12:54,030 then, of course, that will not be deleted, 263 00:12:54,030 --> 00:12:55,130 because its not there. 264 00:12:56,530 --> 00:12:59,233 Let's now take a look if this actually works. 265 00:13:00,380 --> 00:13:02,530 I'm gonna log req dot query and 266 00:13:02,530 --> 00:13:05,723 at the same time our query object. 267 00:13:08,742 --> 00:13:09,692 Giving this a save. 268 00:13:10,600 --> 00:13:12,060 Don't worry about our results now. 269 00:13:12,060 --> 00:13:14,190 All I want to take a look at is 270 00:13:14,190 --> 00:13:17,080 our query object, just to make sure 271 00:13:17,080 --> 00:13:19,530 that this logic that we have here actually works. 272 00:13:21,540 --> 00:13:26,540 Let's add a sort here of one and a limit of 10. 273 00:13:27,260 --> 00:13:29,210 These will make more sense later. 274 00:13:29,210 --> 00:13:30,540 For now, I am just adding them, 275 00:13:30,540 --> 00:13:32,293 so that I can later exclude them. 276 00:13:34,490 --> 00:13:37,120 Results don't matter, all that matters, 277 00:13:37,120 --> 00:13:40,640 is that our original query is this one here, 278 00:13:40,640 --> 00:13:42,820 and then our query object, which is 279 00:13:42,820 --> 00:13:44,010 the one that we're going to use, 280 00:13:44,010 --> 00:13:46,320 only has difficulty set to easy. 281 00:13:46,320 --> 00:13:49,723 That's because we excluded, page, sort, and limit. 282 00:13:51,000 --> 00:13:53,460 This now works, so instead of using 283 00:13:53,460 --> 00:13:57,033 req dot query, we're gonna use our query object. 284 00:13:59,390 --> 00:14:03,000 Let's get rid of that and try it again. 285 00:14:03,000 --> 00:14:05,080 Now we should be back to querying for 286 00:14:05,080 --> 00:14:07,180 all the documents that have a difficulty 287 00:14:07,180 --> 00:14:11,473 set to easy and ignoring all of these other fields. 288 00:14:13,256 --> 00:14:14,150 Send that. 289 00:14:14,150 --> 00:14:15,930 And indeed, we are back to our four 290 00:14:15,930 --> 00:14:18,623 results that we had before. 291 00:14:19,900 --> 00:14:22,610 We can also turn on the duration, 292 00:14:22,610 --> 00:14:24,743 and indeed, we will now have two results. 293 00:14:26,110 --> 00:14:27,180 Remember that? 294 00:14:27,180 --> 00:14:28,643 And if we turn these off, 295 00:14:29,960 --> 00:14:32,380 well, then off course its gonna work the same. 296 00:14:32,380 --> 00:14:34,330 Let's just delete this empty line here. 297 00:14:36,740 --> 00:14:40,340 And so, indeed, with our original query string, 298 00:14:40,340 --> 00:14:42,693 things obviously also still worked the same. 299 00:14:44,220 --> 00:14:47,630 We prepared our filter feature so that it 300 00:14:47,630 --> 00:14:51,410 ignores page, sort, and limit fields. 301 00:14:51,410 --> 00:14:53,450 But there is actually something more we need 302 00:14:53,450 --> 00:14:56,210 to do in our code, in order to basically 303 00:14:56,210 --> 00:14:59,753 be able to implement these features in future videos. 304 00:15:01,360 --> 00:15:03,250 Let's go back here to our code. 305 00:15:03,250 --> 00:15:04,570 So let's now learn a little bit 306 00:15:04,570 --> 00:15:07,093 about how queries actually work in Mongoose. 307 00:15:08,220 --> 00:15:09,910 I think I mentioned this before, 308 00:15:09,910 --> 00:15:13,400 but its very important to talk about this again. 309 00:15:13,400 --> 00:15:16,943 This find method here is going to return a query. 310 00:15:18,060 --> 00:15:20,430 All of this here will return a query. 311 00:15:20,430 --> 00:15:22,410 And that is the reason why we can then 312 00:15:22,410 --> 00:15:24,840 chain other methods like this. 313 00:15:24,840 --> 00:15:28,630 Like where, equals, and all these other methods 314 00:15:28,630 --> 00:15:30,770 that I talked to you about before. 315 00:15:30,770 --> 00:15:33,770 Let me actually show that to you in the documentation again. 316 00:15:37,670 --> 00:15:40,170 Here we have the query object, 317 00:15:40,170 --> 00:15:42,710 and again, when we use the find method, 318 00:15:42,710 --> 00:15:46,590 it will return an object which is a query. 319 00:15:46,590 --> 00:15:48,310 So in query dot prototype, 320 00:15:48,310 --> 00:15:50,180 we then have all of these methods. 321 00:15:50,180 --> 00:15:52,820 For example, down here we have where, 322 00:15:52,820 --> 00:15:54,040 which I just mentioned. 323 00:15:54,040 --> 00:15:55,790 We have sort which is the one 324 00:15:55,790 --> 00:15:58,120 that were gonna use later to sort. 325 00:15:58,120 --> 00:16:00,870 We have, let's see, we have less than 326 00:16:00,870 --> 00:16:03,740 or less than equal, we have greater. 327 00:16:03,740 --> 00:16:05,260 We have... 328 00:16:05,260 --> 00:16:06,700 What else did we use? 329 00:16:06,700 --> 00:16:08,070 We used equals. 330 00:16:08,070 --> 00:16:11,310 All of these are part of query dot prototype. 331 00:16:11,310 --> 00:16:13,920 Which, again, refers to objects that 332 00:16:13,920 --> 00:16:16,783 we're creating using the query class. 333 00:16:19,613 --> 00:16:21,410 Again, this is the reason why 334 00:16:21,410 --> 00:16:24,070 we can do this sort of chaining. 335 00:16:24,070 --> 00:16:26,290 Now comes the important part. 336 00:16:26,290 --> 00:16:28,350 As soon as we actually await the 337 00:16:28,350 --> 00:16:30,970 result of the query, so as soon as 338 00:16:30,970 --> 00:16:33,950 we use await here or here, for example. 339 00:16:33,950 --> 00:16:35,890 As soon as we use this await, 340 00:16:35,890 --> 00:16:37,910 the query will then execute and 341 00:16:37,910 --> 00:16:39,610 come back with the documents that 342 00:16:39,610 --> 00:16:42,144 actually match our query. 343 00:16:42,144 --> 00:16:44,960 If we do it like this, such as we have here, 344 00:16:44,960 --> 00:16:46,730 then there is now way of, later, 345 00:16:46,730 --> 00:16:49,110 implementing sorting, or pagination, 346 00:16:49,110 --> 00:16:50,793 or all of these other features. 347 00:16:51,880 --> 00:16:53,870 Instead, what we will have to do, 348 00:16:53,870 --> 00:16:57,220 is to save this part here into a query, 349 00:16:57,220 --> 00:17:00,200 then in the end, as soon as we change all the methods 350 00:17:00,200 --> 00:17:02,440 to the query that we need to, only then 351 00:17:02,440 --> 00:17:04,863 by the end, we can await that query. 352 00:17:06,080 --> 00:17:08,600 For example, we're going to use the sort method. 353 00:17:08,600 --> 00:17:10,200 We're going to use the predict method, 354 00:17:10,200 --> 00:17:12,440 we're going to use the limit method, 355 00:17:12,440 --> 00:17:14,500 and we're going to use, really, a bunch of methods, 356 00:17:14,500 --> 00:17:16,620 and chain them to this query. 357 00:17:16,620 --> 00:17:18,110 That would be impossible to do, 358 00:17:18,110 --> 00:17:20,910 again, if we await the result of 359 00:17:20,910 --> 00:17:23,073 this initial query here, right away. 360 00:17:24,590 --> 00:17:26,470 I hope that made sense. 361 00:17:26,470 --> 00:17:28,660 The way that we will do it 362 00:17:28,660 --> 00:17:30,140 is that we 363 00:17:31,090 --> 00:17:33,473 will have our tours down here. 364 00:17:35,540 --> 00:17:37,623 And this will await the query. 365 00:17:41,310 --> 00:17:43,830 The query is, well, simply the 366 00:17:43,830 --> 00:17:45,533 query without any await. 367 00:17:47,460 --> 00:17:49,360 Just to make it consistent with 368 00:17:49,360 --> 00:17:50,363 this part here, 369 00:17:52,060 --> 00:17:53,163 let's do it like this. 370 00:17:55,603 --> 00:17:57,123 Let's say that, 371 00:17:58,540 --> 00:18:00,437 first, we build the query 372 00:18:00,437 --> 00:18:03,363 and then we execute the query. 373 00:18:07,290 --> 00:18:08,313 That's not correct. 374 00:18:11,490 --> 00:18:13,040 Since we're doing comments here, 375 00:18:13,040 --> 00:18:14,330 let's also say send 376 00:18:15,300 --> 00:18:16,790 response. 377 00:18:16,790 --> 00:18:20,023 Just to make our code a bit more easy to scan. 378 00:18:20,870 --> 00:18:22,380 I hope that all of this made sense, 379 00:18:22,380 --> 00:18:24,820 this turned out to be quite a long video, 380 00:18:24,820 --> 00:18:26,780 but it was important to finish 381 00:18:26,780 --> 00:18:29,356 this part here by explaining you 382 00:18:29,356 --> 00:18:31,830 this logic here, so that in the next videos, 383 00:18:31,830 --> 00:18:34,080 we will then be able to implement 384 00:18:34,080 --> 00:18:36,110 the rest of the features. 385 00:18:36,110 --> 00:18:37,940 Because, again, without having it 386 00:18:37,940 --> 00:18:39,983 like this, it would not work.