﻿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,400
‫just a simple Javascript problem.

81
00:04:17,400 --> 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.

