All language subtitles for 015 Making the API Better_ Advanced Filtering_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:00,960 --> 00:00:02,940 So the filter feature that we have 2 00:00:02,940 --> 00:00:06,250 implemented right now already works great, 3 00:00:06,250 --> 00:00:09,860 but in this video we wanna take it to the next level 4 00:00:09,860 --> 00:00:12,733 by allowing some even more complex queries. 5 00:00:14,210 --> 00:00:17,680 So right now a user can only filter the documents 6 00:00:17,680 --> 00:00:22,430 by setting one key equal to a value, right? 7 00:00:22,430 --> 00:00:24,760 But now, we actually want to also implement 8 00:00:24,760 --> 00:00:27,680 the greater than, the greater or equal than, 9 00:00:27,680 --> 00:00:31,733 the less than, and the less or equal than operators. 10 00:00:32,780 --> 00:00:34,510 So instead of just having equal, 11 00:00:34,510 --> 00:00:37,500 we want to actually be able to, for example, 12 00:00:37,500 --> 00:00:40,130 say duration greater or equal than five, 13 00:00:40,130 --> 00:00:42,290 and not just equal, all right? 14 00:00:42,290 --> 00:00:45,310 And so that makes everything a bit more complex. 15 00:00:45,310 --> 00:00:48,140 Now, before writing any code, I will actually 16 00:00:48,140 --> 00:00:50,810 do the exercise of writing out the query 17 00:00:50,810 --> 00:00:53,043 how it should look like in MongoDB. 18 00:00:55,150 --> 00:00:58,200 So what would the filter object actually look like? 19 00:00:58,200 --> 00:01:00,360 And let's write it here as a comment, 20 00:01:00,360 --> 00:01:02,273 and again, just as an exercise. 21 00:01:03,270 --> 00:01:06,090 So the object would look a bit like this, 22 00:01:06,090 --> 00:01:09,723 so difficulty, start with that one, set to easy, 23 00:01:14,040 --> 00:01:17,030 and then duration; and now remember that when 24 00:01:17,030 --> 00:01:21,000 we want to use an operator, we need to start another object. 25 00:01:21,000 --> 00:01:24,530 And then for the greater or equal than operator 26 00:01:24,530 --> 00:01:29,530 we use it like this, to five, right, remember that? 27 00:01:30,640 --> 00:01:33,050 So this is how we would manually write 28 00:01:33,050 --> 00:01:36,383 the filter object for the query that we just specified. 29 00:01:37,340 --> 00:01:40,240 Now let's actually go back to Postman 30 00:01:40,240 --> 00:01:43,860 so that I can show you a very kind of standard way 31 00:01:43,860 --> 00:01:47,440 of writing a query string including these operators. 32 00:01:47,440 --> 00:01:50,670 And we do it like this, so before the equals sign 33 00:01:50,670 --> 00:01:53,150 we open up the brackets and then in here 34 00:01:53,150 --> 00:01:55,880 we write the operator, so in this case 35 00:01:55,880 --> 00:01:58,650 greater than or equal, and that's it. 36 00:01:58,650 --> 00:02:01,880 And so basically like this, we add a third part 37 00:02:01,880 --> 00:02:04,680 to the key value pair, so we have the key, 38 00:02:04,680 --> 00:02:07,610 the value, and now also the operator. 39 00:02:07,610 --> 00:02:09,930 And we use again these brackets 40 00:02:09,930 --> 00:02:11,923 in order to specify the operator. 41 00:02:13,060 --> 00:02:15,320 So again, that is a standard way 42 00:02:15,320 --> 00:02:17,170 and so let's now actually go ahead 43 00:02:17,170 --> 00:02:21,150 and take a look at the query string that Express gives us 44 00:02:21,150 --> 00:02:23,360 and so just like before, let's actually 45 00:02:23,360 --> 00:02:25,823 log a reg dot query to the console, 46 00:02:27,310 --> 00:02:32,310 log reg dot query, all right. 47 00:02:32,600 --> 00:02:35,530 And so let's take a look what our query object 48 00:02:35,530 --> 00:02:37,640 is gonna look like when we specify 49 00:02:37,640 --> 00:02:39,940 the query string like this. 50 00:02:39,940 --> 00:02:42,040 All right, now the first thing that you notice 51 00:02:42,040 --> 00:02:43,640 is that we get an error here, 52 00:02:43,640 --> 00:02:45,573 but don't worry about that for now. 53 00:02:46,570 --> 00:02:50,470 So what I'm interested here, is this object, 54 00:02:50,470 --> 00:02:52,920 and so let me actually go ahead and copy it here. 55 00:02:55,570 --> 00:02:58,820 All right, so what do you notice here? 56 00:02:58,820 --> 00:03:01,420 Well, what we see here is that the query object 57 00:03:01,420 --> 00:03:03,870 looks almost identical to the filter object 58 00:03:03,870 --> 00:03:06,350 that we wrote manually, the only difference 59 00:03:06,350 --> 00:03:10,513 is that in this one we have the MongoDB operator sign here. 60 00:03:11,360 --> 00:03:13,420 So that's really the only thing that's missing here 61 00:03:13,420 --> 00:03:16,210 in front of this operator name. 62 00:03:16,210 --> 00:03:18,620 Okay, and so the solution for this 63 00:03:18,620 --> 00:03:21,780 is to basically replace all the operators like this 64 00:03:21,780 --> 00:03:24,300 with their correspondent MongoDB operators, 65 00:03:24,300 --> 00:03:29,030 so basically adding this dollar sign here, okay. 66 00:03:29,030 --> 00:03:31,270 So let's now implement that, 67 00:03:31,270 --> 00:03:33,433 and in fact we do it somewhere up here, 68 00:03:34,810 --> 00:03:36,960 let's actually add some more comments here. 69 00:03:38,700 --> 00:03:42,090 So filtering that we did in the last lecture, 70 00:03:42,090 --> 00:03:45,313 now here let's add some advanced filtering, 71 00:03:47,920 --> 00:03:50,903 and so that's the code that we're gonna write now. 72 00:03:52,720 --> 00:03:56,393 Now let's put this code here right at the top, all right. 73 00:03:57,290 --> 00:03:59,860 Then this code here we don't really need 74 00:03:59,860 --> 00:04:01,160 but I still want to keep it here 75 00:04:01,160 --> 00:04:03,193 so let's put it just here at the end. 76 00:04:04,960 --> 00:04:08,270 And then just this code here as a reference 77 00:04:08,270 --> 00:04:11,210 just to make sure that we know what we're doing here. 78 00:04:11,210 --> 00:04:13,330 All right, and so now that we know 79 00:04:13,330 --> 00:04:15,230 what we need to do here, it is actually 80 00:04:15,230 --> 00:04:17,399 just a simple Javascript problem. 81 00:04:17,399 --> 00:04:19,420 And the way I'm solving it is this, 82 00:04:19,420 --> 00:04:22,710 so first I'm gonna convert the object to a string 83 00:04:25,230 --> 00:04:30,230 so query string equals JSON dot stringify of query object, 84 00:04:35,600 --> 00:04:38,780 and so now I can use that query string 85 00:04:38,780 --> 00:04:40,963 to use the replace function on it. 86 00:04:42,060 --> 00:04:44,530 All right, and so what I want to replace now 87 00:04:44,530 --> 00:04:48,330 is the gte with dollar sign gte, 88 00:04:48,330 --> 00:04:50,403 and then also some other operator. 89 00:04:51,360 --> 00:04:53,290 So the ones we want to replace are 90 00:04:53,290 --> 00:04:56,113 greater than or equal, greater than, 91 00:04:56,970 --> 00:05:01,010 less than or equal, and less than, 92 00:05:01,010 --> 00:05:03,620 and there are a couple ways in which we can do it, 93 00:05:03,620 --> 00:05:06,193 but I'm gonna use a regular expression. 94 00:05:07,243 --> 00:05:10,340 And for me personally, regular expressions 95 00:05:10,340 --> 00:05:13,450 are one of the most difficult concepts in Javascript 96 00:05:13,450 --> 00:05:16,210 and actually in general in programming. 97 00:05:16,210 --> 00:05:18,270 So usually when I need to do something like this, 98 00:05:18,270 --> 00:05:21,538 I simply go on Stack Overflow or just Google around 99 00:05:21,538 --> 00:05:24,180 to find the right solution for the problem 100 00:05:24,180 --> 00:05:26,280 that I'm trying to solve, all right. 101 00:05:26,280 --> 00:05:28,070 And so what we want to do now here 102 00:05:28,070 --> 00:05:31,660 is to basically match one of these four words 103 00:05:31,660 --> 00:05:33,900 and then replace it with the same words 104 00:05:33,900 --> 00:05:35,933 but with the dollar sign in front. 105 00:05:36,980 --> 00:05:38,530 And so the regular expression to 106 00:05:38,530 --> 00:05:42,620 find one of these four words goes like this; 107 00:05:42,620 --> 00:05:46,820 so we open up these parenthesis and then we write 108 00:05:46,820 --> 00:05:50,517 the operators, so gte or gt or lte or lt. 109 00:05:55,500 --> 00:06:00,500 And then we also need to add this \b before and after, 110 00:06:01,140 --> 00:06:04,283 and that's because we only want to match these exact words. 111 00:06:05,220 --> 00:06:08,183 So imagine there's a word which has lt in it, 112 00:06:08,183 --> 00:06:10,700 then we of course do not want to match that 113 00:06:10,700 --> 00:06:14,070 we only want to match if it is this exact word, 114 00:06:14,070 --> 00:06:16,840 without any other string around it. 115 00:06:16,840 --> 00:06:19,170 And so this regular expression that I have here 116 00:06:19,170 --> 00:06:21,310 will take care of that, and actually there is 117 00:06:21,310 --> 00:06:24,670 one piece missing and that is this g flag here 118 00:06:24,670 --> 00:06:27,130 which means that it will actually happen multiple times. 119 00:06:27,130 --> 00:06:30,270 So if we have like two or three operators 120 00:06:30,270 --> 00:06:33,880 or even all of them, then it will replace all of them. 121 00:06:33,880 --> 00:06:36,240 And without this g here, it would only 122 00:06:36,240 --> 00:06:40,300 replace the first occurrence, so this one is very important. 123 00:06:40,300 --> 00:06:43,460 Now, what do we actually want to replace it with? 124 00:06:43,460 --> 00:06:45,450 Well, the replace method actually 125 00:06:45,450 --> 00:06:48,880 accepts a callback which is very powerful, 126 00:06:48,880 --> 00:06:51,100 and this callback has as the first argument, 127 00:06:51,100 --> 00:06:53,523 the matched word, or the matched string. 128 00:06:55,060 --> 00:06:58,690 So we can pass match into that callback function 129 00:06:58,690 --> 00:07:01,840 and what we return from this callback is the new string 130 00:07:01,840 --> 00:07:04,690 that will replace the old one, okay? 131 00:07:04,690 --> 00:07:07,200 So let's do a template string here, 132 00:07:07,200 --> 00:07:08,820 and so we want to replace the match 133 00:07:08,820 --> 00:07:13,820 with dollar sign match, okay, so this is here 134 00:07:14,190 --> 00:07:17,060 the part of the template string syntax. 135 00:07:17,060 --> 00:07:19,860 So this here is this match, and then 136 00:07:19,860 --> 00:07:22,613 we want to put the dollar sign in front of that. 137 00:07:25,690 --> 00:07:28,570 And now just to make sure, let's actually log it 138 00:07:29,970 --> 00:07:34,250 to the console and actually want the object back, 139 00:07:34,250 --> 00:07:38,303 so JSON dot parse the query string. 140 00:07:40,210 --> 00:07:43,200 All right, let me just go ahead and clear this here 141 00:07:43,200 --> 00:07:45,603 so that you can see the results a bit better. 142 00:07:48,541 --> 00:07:50,050 So again, we get this error here 143 00:07:50,050 --> 00:07:52,240 and that's of course because MongoDB 144 00:07:52,240 --> 00:07:54,330 cannot really use the query string or 145 00:07:54,330 --> 00:07:56,933 the query object as we have it right now. 146 00:07:58,980 --> 00:08:01,300 And here we have the two results 147 00:08:01,300 --> 00:08:04,610 and you actually see that our result 148 00:08:04,610 --> 00:08:07,150 is the exact same as before and so 149 00:08:07,150 --> 00:08:09,670 something here is clearly not working. 150 00:08:09,670 --> 00:08:12,240 So let's try to figure out what that is. 151 00:08:12,240 --> 00:08:15,940 And here the regular expression looks just fine, 152 00:08:15,940 --> 00:08:18,707 everything looks fine here, ah, but okay, 153 00:08:18,707 --> 00:08:22,470 the problem is that I'm replacing it in the string 154 00:08:22,470 --> 00:08:24,320 but then I'm not saving it anywhere. 155 00:08:24,320 --> 00:08:28,030 And so actually we want to save it back to the query string. 156 00:08:28,030 --> 00:08:30,580 So let's change this here to a let, 157 00:08:30,580 --> 00:08:33,940 so that it can then mutate the data 158 00:08:33,940 --> 00:08:38,940 and so let's say, query string, oh sorry. 159 00:08:39,640 --> 00:08:44,640 So, query string equals the query string replaced, 160 00:08:45,530 --> 00:08:49,750 just like before, so what I was forgetting is simply to 161 00:08:49,750 --> 00:08:52,693 actually save the result here back into the variable. 162 00:08:54,320 --> 00:08:58,670 Let's try that again, and now it's working. 163 00:08:58,670 --> 00:09:01,170 So now we have the dollar sign 164 00:09:01,170 --> 00:09:04,400 in front of the operator, great. 165 00:09:04,400 --> 00:09:07,840 Okay, so it works, let's get rid of these comments here 166 00:09:07,840 --> 00:09:10,430 and now finally, all we have to do is to actually here 167 00:09:10,430 --> 00:09:13,703 not use the query object but just use this. 168 00:09:16,730 --> 00:09:19,290 So JSON.parse query string, and of course 169 00:09:19,290 --> 00:09:22,020 if you do not have any operator in the query string 170 00:09:22,020 --> 00:09:23,770 then everything will work just fine. 171 00:09:23,770 --> 00:09:27,920 It will simply not find any of these four operators there 172 00:09:27,920 --> 00:09:29,670 but that's no problem, it will then 173 00:09:30,539 --> 00:09:31,403 simply not replace anything. 174 00:09:32,681 --> 00:09:36,290 And also let's go ahead and try this out 175 00:09:37,690 --> 00:09:39,800 and it's taking a bit of time but indeed 176 00:09:39,800 --> 00:09:41,750 it came back with three results, 177 00:09:41,750 --> 00:09:45,020 and so let's now check if they're actually correct. 178 00:09:45,020 --> 00:09:47,860 So the duration should be greater or equal than five, 179 00:09:47,860 --> 00:09:50,570 and this one here is duration of five, 180 00:09:50,570 --> 00:09:52,730 this has a duration of nine, which is 181 00:09:52,730 --> 00:09:54,880 greater than or equal than five, 182 00:09:54,880 --> 00:09:58,730 and so it's actually working, the difficulty is still easy 183 00:09:58,730 --> 00:10:02,460 and so what it means is that the code 184 00:10:02,460 --> 00:10:04,603 that we just implemented works just fine. 185 00:10:05,480 --> 00:10:08,750 Perfect, now let's just for the fun of it 186 00:10:08,750 --> 00:10:11,380 add another parameter up there, 187 00:10:11,380 --> 00:10:13,860 so let's filter for the price now as well. 188 00:10:13,860 --> 00:10:18,860 So this one has almost 2000, then 1100, this one has 300. 189 00:10:19,350 --> 00:10:23,070 So let's now filter for prices less than a thousand, 190 00:10:23,070 --> 00:10:25,150 or less than a thousand five hundred. 191 00:10:28,100 --> 00:10:32,920 And price, and now again our brackets, 192 00:10:32,920 --> 00:10:37,920 and we use less than 1500, and all right, send that. 193 00:10:41,320 --> 00:10:46,240 And what do we get here, oh, now we only have two results. 194 00:10:46,240 --> 00:10:51,240 And indeed, the prices here, 397, and here 1197, 195 00:10:51,420 --> 00:10:54,930 and so the one before that was 2000 is now gone. 196 00:10:54,930 --> 00:10:57,470 So we filtered that one out as well 197 00:10:57,470 --> 00:11:00,670 using again the operator that we just implemented. 198 00:11:00,670 --> 00:11:03,030 And we could now filter for all kinds of stuff here 199 00:11:03,030 --> 00:11:07,060 but you get the point, and so yeah, 200 00:11:07,060 --> 00:11:10,110 we implemented our kind of advanced filtering here 201 00:11:10,110 --> 00:11:14,500 at this point, which now even accepts these four operators. 202 00:11:14,500 --> 00:11:16,600 Now in the real world, we would then have to 203 00:11:16,600 --> 00:11:19,340 write some documentation, basically in order to allow 204 00:11:19,340 --> 00:11:22,040 the user to know which kinds of operation 205 00:11:22,040 --> 00:11:25,100 they can do on our API, right? 206 00:11:25,100 --> 00:11:28,800 So again, ideally we would completely document our API, 207 00:11:28,800 --> 00:11:31,660 specifying which requests can be made 208 00:11:31,660 --> 00:11:34,360 using which htp methods, and then also 209 00:11:34,360 --> 00:11:36,490 what kind of filtering or sorting, 210 00:11:36,490 --> 00:11:39,580 or all these features, which of them are available 211 00:11:39,580 --> 00:11:41,570 and how they can use it, right? 212 00:11:41,570 --> 00:11:44,400 Now, in our case we of course will not do that 213 00:11:44,400 --> 00:11:47,000 but again, don't forget that if you're really implementing 214 00:11:47,000 --> 00:11:50,160 an API that is gonna be used by someone else, 215 00:11:50,160 --> 00:11:53,600 then you must really do this kind of documentation. 216 00:11:53,600 --> 00:11:56,780 But anyway, let's now move on to our next video 217 00:11:56,780 --> 00:11:59,203 and implement a sorting functionality. 17830

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