Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
00:00:01,110 --> 00:00:03,330
In this video, we're gonna talk about
2
00:00:03,330 --> 00:00:06,180
the second type of Mongoose middleware,
3
00:00:06,180 --> 00:00:08,132
which is query middleware.
4
00:00:09,690 --> 00:00:12,169
And, as the name says, query middleware
5
00:00:12,169 --> 00:00:15,720
allows us to run functions before or after
6
00:00:15,720 --> 00:00:18,360
a certain query is executed.
7
00:00:18,360 --> 00:00:21,020
And so let's now add a pre-find hook,
8
00:00:21,020 --> 00:00:23,730
so basically, a middleware that is gonna run
9
00:00:23,730 --> 00:00:26,493
before any find query is executed.
10
00:00:29,780 --> 00:00:31,740
So let's add another comment here.
11
00:00:31,740 --> 00:00:35,283
So this is query middleware.
12
00:00:36,270 --> 00:00:38,760
And of course, it works in a very similar way
13
00:00:38,760 --> 00:00:39,763
as before.
14
00:00:41,320 --> 00:00:43,950
So the tourSchema, and then pre,
15
00:00:43,950 --> 00:00:46,280
and in here we define the hook,
16
00:00:46,280 --> 00:00:47,557
which is gonna be "find."
17
00:00:50,110 --> 00:00:52,900
So, function, and again, we have access
18
00:00:52,900 --> 00:00:55,540
to the next function.
19
00:00:55,540 --> 00:00:57,870
And actually, let's start by calling it here
20
00:00:57,870 --> 00:01:00,880
at the end so that we don't forget it.
21
00:01:00,880 --> 00:01:03,310
Okay, and so you see, that it looks
22
00:01:03,310 --> 00:01:05,680
exactly like the other middleware,
23
00:01:05,680 --> 00:01:07,170
the other pre-hook.
24
00:01:07,170 --> 00:01:10,320
The only difference here is really this find hook,
25
00:01:10,320 --> 00:01:12,360
which will make this query middleware
26
00:01:12,360 --> 00:01:14,320
and not document middleware.
27
00:01:14,320 --> 00:01:15,153
All right?
28
00:01:15,153 --> 00:01:17,040
And so, the big difference here is
29
00:01:17,040 --> 00:01:20,910
that the this keyword will now point at the current query
30
00:01:20,910 --> 00:01:22,700
and not at the current document,
31
00:01:22,700 --> 00:01:25,580
because we're not really processing any documents here.
32
00:01:25,580 --> 00:01:28,370
We're really gonna be processing a query.
33
00:01:28,370 --> 00:01:29,203
Okay?
34
00:01:29,203 --> 00:01:32,160
And the use case that we're gonna do here is this.
35
00:01:32,160 --> 00:01:34,380
So let's suppose that we can have
36
00:01:34,380 --> 00:01:36,670
secret tours in our database,
37
00:01:36,670 --> 00:01:39,760
like for tours that are only offered internally,
38
00:01:39,760 --> 00:01:43,160
or for a very small, like, VIP group of people,
39
00:01:43,160 --> 00:01:45,420
and that the public shouldn't know about.
40
00:01:45,420 --> 00:01:47,327
Now, since these tours are secret,
41
00:01:47,327 --> 00:01:51,080
we do not want the secret tours to ever appear
42
00:01:51,080 --> 00:01:52,510
in the result outputs.
43
00:01:52,510 --> 00:01:53,510
Right?
44
00:01:53,510 --> 00:01:56,950
And so what we're gonna do is to create a secret tour field
45
00:01:56,950 --> 00:02:00,780
and then query only for tours that are not secret.
46
00:02:00,780 --> 00:02:01,690
All right?
47
00:02:01,690 --> 00:02:02,763
So, let's do that.
48
00:02:04,160 --> 00:02:07,103
Start by adding here, and let's do it right at the end.
49
00:02:11,447 --> 00:02:15,114
secretTour, so the type should be a Boolean,
50
00:02:16,560 --> 00:02:17,980
and I think this is the first time
51
00:02:17,980 --> 00:02:19,710
we're actually using a Boolean,
52
00:02:19,710 --> 00:02:22,030
so this would either be true or false.
53
00:02:22,030 --> 00:02:23,852
So if it's true, then it is a secret tour,
54
00:02:23,852 --> 00:02:25,770
and we don't want it to show up,
55
00:02:25,770 --> 00:02:29,133
and, by default, it is false.
56
00:02:30,570 --> 00:02:31,403
All right?
57
00:02:31,403 --> 00:02:35,000
And so, basically, usually the tours are not secret.
58
00:02:35,000 --> 00:02:35,950
Okay.
59
00:02:35,950 --> 00:02:39,740
Next up, let's actually go ahead and create a secret tour
60
00:02:40,900 --> 00:02:44,610
so that we can then test using it, okay?
61
00:02:44,610 --> 00:02:49,610
So let's call this here the Super Secret Tour.
62
00:02:50,530 --> 00:02:51,880
All of this doesn't matter,
63
00:02:54,130 --> 00:02:58,603
and let me just say that secretTour is indeed true.
64
00:02:59,700 --> 00:03:01,020
Okay?
65
00:03:01,020 --> 00:03:02,443
Save it here ...
66
00:03:03,480 --> 00:03:05,980
And, uh, where is that?
67
00:03:05,980 --> 00:03:08,520
Yeah. So secretTour is true.
68
00:03:08,520 --> 00:03:10,750
And let's now actually head over to Compass
69
00:03:10,750 --> 00:03:13,783
and delete all of these other tours that we had there.
70
00:03:15,600 --> 00:03:17,483
So, let's reload this ...
71
00:03:18,890 --> 00:03:22,813
And then, down here, we should have ...
72
00:03:24,470 --> 00:03:27,890
Yeah, this test tour here, we can delete that.
73
00:03:27,890 --> 00:03:29,613
Another test tour ...
74
00:03:30,740 --> 00:03:32,540
So all this clutter here, basically,
75
00:03:33,730 --> 00:03:35,530
we want to get rid of it.
76
00:03:35,530 --> 00:03:37,600
We only keep the secretTour here
77
00:03:37,600 --> 00:03:40,010
so that we can now experiment with it.
78
00:03:40,010 --> 00:03:43,170
Okay, and you see here that secretTour is set to true,
79
00:03:43,170 --> 00:03:44,530
while the other ones, of course,
80
00:03:44,530 --> 00:03:46,180
do not have this attribute,
81
00:03:46,180 --> 00:03:48,110
because, by the time we created them,
82
00:03:48,110 --> 00:03:49,993
we didn't have the secretTour yet.
83
00:03:51,780 --> 00:03:54,060
So, now, just before we start,
84
00:03:54,060 --> 00:03:57,539
back in Postman, let's confirm that, indeed,
85
00:03:57,539 --> 00:04:01,230
the last tour here, and actually it's not the last tour,
86
00:04:01,230 --> 00:04:02,660
so where is it?
87
00:04:02,660 --> 00:04:03,570
Oh, it's the first one.
88
00:04:03,570 --> 00:04:05,950
So here we have the Super Secret Tour,
89
00:04:05,950 --> 00:04:07,483
of course, set to true.
90
00:04:08,360 --> 00:04:12,010
All right? So, moving back now,
91
00:04:12,010 --> 00:04:13,880
let's now execute the query
92
00:04:13,880 --> 00:04:15,580
like we just said in the beginning.
93
00:04:15,580 --> 00:04:18,350
So, again, keep in mind that this here
94
00:04:18,350 --> 00:04:20,779
is now a query object, all right?
95
00:04:20,779 --> 00:04:23,230
And so we can chain all of the methods
96
00:04:23,230 --> 00:04:25,250
that we have for queries.
97
00:04:25,250 --> 00:04:29,220
And so that simply adds a find method here,
98
00:04:29,220 --> 00:04:31,260
and then basically select all the documents
99
00:04:31,260 --> 00:04:36,070
where secretTour is not true, okay?
100
00:04:36,070 --> 00:04:40,540
So secretTour ...
101
00:04:40,540 --> 00:04:43,530
And then is not equal to true.
102
00:04:43,530 --> 00:04:45,710
And I'm doing it like this because, remember,
103
00:04:45,710 --> 00:04:49,170
the editors are not currently set to false.
104
00:04:49,170 --> 00:04:51,120
They do simply not have this attribute.
105
00:04:52,090 --> 00:04:53,100
All right?
106
00:04:53,100 --> 00:04:56,210
Okay, so let's test it out now again.
107
00:04:56,210 --> 00:04:58,263
And so it should now be gone here.
108
00:04:59,220 --> 00:05:01,483
And indeed, it is no longer here.
109
00:05:02,320 --> 00:05:05,570
Okay, we have all the tours that are not secret,
110
00:05:05,570 --> 00:05:07,290
but not the secret tour.
111
00:05:07,290 --> 00:05:08,943
And I'm now seeing that we actually have
112
00:05:08,943 --> 00:05:11,370
secretTour set to false here,
113
00:05:11,370 --> 00:05:13,850
but that's really just a Mongoose thing,
114
00:05:13,850 --> 00:05:17,913
so let's take another look here at Compass,
115
00:05:18,830 --> 00:05:19,753
and reload.
116
00:05:20,800 --> 00:05:22,920
And so you see that, actually, in the database,
117
00:05:22,920 --> 00:05:25,450
secretTour is not set to false.
118
00:05:25,450 --> 00:05:27,890
Mongoose is simply adding that because we have it
119
00:05:27,890 --> 00:05:30,478
in our schema as the default, and it's not in the database.
120
00:05:30,478 --> 00:05:34,360
And so it's basically, then, putting it there anyway.
121
00:05:34,360 --> 00:05:37,150
So you see that we actually have 11 documents,
122
00:05:37,150 --> 00:05:40,710
but then here in Postman we only get ten results.
123
00:05:40,710 --> 00:05:41,600
And that is, of course,
124
00:05:41,600 --> 00:05:45,360
because our Secret Tour is basically filtered out.
125
00:05:45,360 --> 00:05:46,193
Okay?
126
00:05:46,193 --> 00:05:47,910
So, let's try to understand again
127
00:05:47,910 --> 00:05:49,320
what really happens.
128
00:05:49,320 --> 00:05:51,730
So as soon as we hit this route, here,
129
00:05:51,730 --> 00:05:53,170
using the get method,
130
00:05:53,170 --> 00:05:55,313
let's see what happens.
131
00:05:57,520 --> 00:06:00,340
So, what happens is that we create a query
132
00:06:00,340 --> 00:06:02,700
using tour.find.
133
00:06:02,700 --> 00:06:03,533
Okay?
134
00:06:03,533 --> 00:06:05,900
And then, of course, we chain all these methods to it
135
00:06:05,900 --> 00:06:08,660
as we talked about in one of the last lectures,
136
00:06:08,660 --> 00:06:09,790
and then, by the end,
137
00:06:09,790 --> 00:06:13,770
we then execute that query here by using await.
138
00:06:13,770 --> 00:06:15,280
Right? Remember that?
139
00:06:15,280 --> 00:06:17,460
So this is where we execute the query.
140
00:06:17,460 --> 00:06:20,030
But, before it actually is executed,
141
00:06:20,030 --> 00:06:24,790
then, our pre-find middleware here is executed.
142
00:06:24,790 --> 00:06:25,623
Okay?
143
00:06:25,623 --> 00:06:27,873
And it is executed because it is find,
144
00:06:27,873 --> 00:06:30,270
just like we used here.
145
00:06:30,270 --> 00:06:31,103
Right?
146
00:06:31,103 --> 00:06:33,020
So, we're creating a find query,
147
00:06:33,020 --> 00:06:36,570
and so, therefore, the find hook is then executed.
148
00:06:36,570 --> 00:06:39,420
Then, in here, since it is query middleware,
149
00:06:39,420 --> 00:06:41,630
the this keyword points to the query.
150
00:06:41,630 --> 00:06:43,670
And so, to that query, we can then chain
151
00:06:43,670 --> 00:06:46,230
yet another find method, right?
152
00:06:46,230 --> 00:06:49,160
And in there, we then filter out the secretTour
153
00:06:49,160 --> 00:06:50,930
using this filter object.
154
00:06:50,930 --> 00:06:51,763
Okay?
155
00:06:51,763 --> 00:06:54,280
So basically saying that we only want tours
156
00:06:54,280 --> 00:06:57,450
where the secretTour is not equal to true.
157
00:06:57,450 --> 00:06:59,120
And it would actually work the same
158
00:06:59,120 --> 00:07:00,979
if we simply said here, false,
159
00:07:00,979 --> 00:07:03,790
but I find it cleaner like this.
160
00:07:03,790 --> 00:07:07,660
Okay, there is now just one thing that we need to fix,
161
00:07:07,660 --> 00:07:10,140
because right now this middleware is running
162
00:07:10,140 --> 00:07:13,010
for find, but not for find1.
163
00:07:13,010 --> 00:07:13,843
Okay?
164
00:07:13,843 --> 00:07:17,023
So let me show you the problem that we might get with that.
165
00:07:18,270 --> 00:07:23,120
So, uh, let's take the ID of the Secret Tour.
166
00:07:23,120 --> 00:07:24,570
So we have the Secret Tour here,
167
00:07:24,570 --> 00:07:29,570
and that's its ID, and so if we get tour,
168
00:07:31,370 --> 00:07:35,040
then that should give us the Super Secret Tour here.
169
00:07:35,040 --> 00:07:35,873
Right?
170
00:07:35,873 --> 00:07:37,383
And so you see, that that filter
171
00:07:37,383 --> 00:07:39,470
that we just built in the middleware
172
00:07:39,470 --> 00:07:41,630
is not working for this command.
173
00:07:41,630 --> 00:07:42,463
Okay?
174
00:07:42,463 --> 00:07:45,640
And that's because the handle function for this route,
175
00:07:45,640 --> 00:07:47,360
as you might remember,
176
00:07:47,360 --> 00:07:51,560
is using findByID, which, behind the scenes,
177
00:07:51,560 --> 00:07:55,290
is find1, and so it's different from find.
178
00:07:55,290 --> 00:07:56,242
All right?
179
00:07:56,242 --> 00:08:01,242
So, we need to specify the same middleware also for find1.
180
00:08:01,750 --> 00:08:03,610
Now, there are two ways of doing that,
181
00:08:03,610 --> 00:08:06,760
and the first one would be simply to go ahead,
182
00:08:06,760 --> 00:08:11,363
copy this code, and then put find1 here.
183
00:08:12,210 --> 00:08:14,210
But that's not really good,
184
00:08:14,210 --> 00:08:16,970
and so instead we're gonna use a regular expression.
185
00:08:16,970 --> 00:08:20,530
And that is quite easy, and so ...
186
00:08:20,530 --> 00:08:22,700
And let me actually just duplicate this here,
187
00:08:22,700 --> 00:08:24,013
comment this piece out,
188
00:08:25,495 --> 00:08:28,360
and then, remember, a regular expression
189
00:08:28,360 --> 00:08:30,550
starts and ends with a slash.
190
00:08:30,550 --> 00:08:32,500
And then in here, what I want to say,
191
00:08:32,500 --> 00:08:34,437
is that this middleware should be executed
192
00:08:34,437 --> 00:08:36,510
not only for find,
193
00:08:36,510 --> 00:08:40,450
but for all the commands that start with the name find.
194
00:08:40,450 --> 00:08:41,283
Okay?
195
00:08:41,283 --> 00:08:45,330
So, find, and find1, and also find1 and delete,
196
00:08:45,330 --> 00:08:46,830
find1 and update,
197
00:08:46,830 --> 00:08:49,400
and so all of these will now actually trigger
198
00:08:49,400 --> 00:08:51,550
this middleware function that we have here.
199
00:08:52,760 --> 00:08:53,890
All right?
200
00:08:53,890 --> 00:08:55,580
So, no need for that.
201
00:08:55,580 --> 00:08:58,510
This regular expression here is way better.
202
00:08:58,510 --> 00:08:59,878
So again, this here simply means
203
00:08:59,878 --> 00:09:03,000
all the strings that start with find.
204
00:09:03,000 --> 00:09:05,140
And actually, since we're here,
205
00:09:05,140 --> 00:09:07,883
let me show you the Mongoose documentations again.
206
00:09:08,970 --> 00:09:13,240
So, when we go here, to middleware in these guides,
207
00:09:13,240 --> 00:09:15,670
you'll then have an overview of all the middleware.
208
00:09:15,670 --> 00:09:16,557
For example, document middleware
209
00:09:16,557 --> 00:09:19,041
is the one that we talked about before,
210
00:09:19,041 --> 00:09:21,640
which runs, for example, on save.
211
00:09:21,640 --> 00:09:23,600
But in fact, document middleware can also
212
00:09:23,600 --> 00:09:26,510
run for stuff like remove.
213
00:09:26,510 --> 00:09:27,460
All right?
214
00:09:27,460 --> 00:09:28,840
Or for validate.
215
00:09:28,840 --> 00:09:31,220
Okay, but I didn't talk about these because
216
00:09:31,220 --> 00:09:34,750
usually the one that we always use is just for save.
217
00:09:34,750 --> 00:09:37,590
Now, query middleware can run for
218
00:09:37,590 --> 00:09:39,340
all of these query functions.
219
00:09:39,340 --> 00:09:41,980
So find, as we just specified,
220
00:09:41,980 --> 00:09:43,780
and now, with our regular expression,
221
00:09:43,780 --> 00:09:45,520
it's also gonna run for find1,
222
00:09:45,520 --> 00:09:47,270
findOneAndDelete, findOneAndRemove,
223
00:09:48,768 --> 00:09:50,518
and findOneAndUpdate.
224
00:09:51,850 --> 00:09:55,130
Anyway, moving back to Postman now,
225
00:09:55,130 --> 00:09:58,650
this should now have fixed this situation here.
226
00:09:58,650 --> 00:10:01,210
So when we now run this query,
227
00:10:01,210 --> 00:10:03,040
it should have no results.
228
00:10:03,040 --> 00:10:04,800
And indeed, it doesn't.
229
00:10:04,800 --> 00:10:08,220
Because, remember, we were trying to get a secretTour.
230
00:10:08,220 --> 00:10:10,370
So the tour with this ID here is secret,
231
00:10:10,370 --> 00:10:12,520
but we never want the secretTours
232
00:10:12,520 --> 00:10:14,380
to show up in any query.
233
00:10:14,380 --> 00:10:17,283
And so that's why, right now, we get zero results.
234
00:10:18,190 --> 00:10:19,023
Okay?
235
00:10:19,023 --> 00:10:20,510
So that works now.
236
00:10:20,510 --> 00:10:22,160
Don't save this,
237
00:10:22,160 --> 00:10:24,230
and now, back to our code.
238
00:10:24,230 --> 00:10:25,900
Let's now actually also specify
239
00:10:25,900 --> 00:10:28,333
a post middleware for find.
240
00:10:30,140 --> 00:10:35,140
So, tourSchema, and then, just like before, post,
241
00:10:35,820 --> 00:10:38,510
and then let's use our regular expression here again
242
00:10:38,510 --> 00:10:41,113
for anything starting with find.
243
00:10:43,340 --> 00:10:45,240
And then just a regular function,
244
00:10:45,240 --> 00:10:47,400
and then here, in the post-find middleware,
245
00:10:47,400 --> 00:10:49,810
we actually get access to all the documents
246
00:10:49,810 --> 00:10:51,713
that we returned from the query.
247
00:10:52,680 --> 00:10:54,573
So let's call that Docs.
248
00:10:55,680 --> 00:10:56,780
All right?
249
00:10:56,780 --> 00:10:59,350
So, remember that this middleware is gonna run
250
00:10:59,350 --> 00:11:02,280
after the query has already executed.
251
00:11:02,280 --> 00:11:04,100
And so, therefore, it can have access
252
00:11:04,100 --> 00:11:06,120
to the documents that were returned.
253
00:11:06,120 --> 00:11:07,900
Again, because that query has
254
00:11:07,900 --> 00:11:10,033
actually already finished at this point.
255
00:11:11,580 --> 00:11:15,510
So let's log these documents to the console,
256
00:11:15,510 --> 00:11:16,343
so docs,
257
00:11:16,343 --> 00:11:20,360
but I also want to do something else here.
258
00:11:20,360 --> 00:11:22,710
So basically, let's create, kind of,
259
00:11:22,710 --> 00:11:25,150
a clock to measure how long it takes
260
00:11:25,150 --> 00:11:27,163
to execute the current query.
261
00:11:28,120 --> 00:11:28,953
All right?
262
00:11:28,953 --> 00:11:30,770
So, how are we gonna do that?
263
00:11:30,770 --> 00:11:32,680
Well, quite simple.
264
00:11:32,680 --> 00:11:36,180
We can simply set a property onto the this object,
265
00:11:36,180 --> 00:11:39,810
because this query object is really just a regular object.
266
00:11:39,810 --> 00:11:42,570
Of course it has access to all these methods,
267
00:11:42,570 --> 00:11:43,760
such as find,
268
00:11:43,760 --> 00:11:45,020
but we can also use it
269
00:11:45,020 --> 00:11:47,283
to set any property that we want on it.
270
00:11:48,660 --> 00:11:51,000
So, again, just a regular object.
271
00:11:51,000 --> 00:11:53,410
And so here we can say this.start
272
00:11:53,410 --> 00:11:55,333
should be the current date.
273
00:11:56,410 --> 00:11:57,243
Okay?
274
00:11:57,243 --> 00:11:59,380
And so this will set it as the
275
00:11:59,380 --> 00:12:02,150
current time in milliseconds, okay?
276
00:12:02,150 --> 00:12:05,320
And so then, here, in the post middleware,
277
00:12:05,320 --> 00:12:08,200
which is gonna run after the query has executed,
278
00:12:08,200 --> 00:12:10,310
we can then subtract the current time
279
00:12:10,310 --> 00:12:11,603
minus the start time.
280
00:12:14,640 --> 00:12:15,833
So console.log,
281
00:12:18,470 --> 00:12:19,583
query took,
282
00:12:21,240 --> 00:12:22,600
and now the current date
283
00:12:26,970 --> 00:12:28,073
minus this.start,
284
00:12:33,400 --> 00:12:34,423
milliseconds.
285
00:12:35,510 --> 00:12:38,295
Okay, let's give it a save,
286
00:12:38,295 --> 00:12:43,295
and so let's now try to run a query and see our results.
287
00:12:45,090 --> 00:12:46,469
Okay?
288
00:12:46,469 --> 00:12:48,390
So, here we get all our tours,
289
00:12:48,390 --> 00:12:49,713
here we have the console,
290
00:12:50,700 --> 00:12:52,140
and let's actually clear that.
291
00:12:52,140 --> 00:12:53,740
There's a lot of stuff in there.
292
00:12:55,540 --> 00:12:56,763
Request again,
293
00:12:58,340 --> 00:13:00,480
and so here are all the results.
294
00:13:00,480 --> 00:13:03,210
So basically these are all the tours that were found,
295
00:13:03,210 --> 00:13:06,490
and so that's the result of console.log of the docs.
296
00:13:06,490 --> 00:13:09,890
So basically the documents that matched the query.
297
00:13:09,890 --> 00:13:13,220
But I'm now interested in this first console.log,
298
00:13:13,220 --> 00:13:17,670
and so, here we see "Query took 120 milliseconds,"
299
00:13:17,670 --> 00:13:19,970
and so that was basically the time that passed
300
00:13:19,970 --> 00:13:22,660
from the beginning, where we defined this,
301
00:13:22,660 --> 00:13:26,950
to after the query has executed, at this point in time.
302
00:13:26,950 --> 00:13:27,783
All right.
303
00:13:27,783 --> 00:13:29,910
And that is all that I had to show you for now
304
00:13:29,910 --> 00:13:31,550
about query middleware,
305
00:13:31,550 --> 00:13:32,680
and just like before,
306
00:13:32,680 --> 00:13:34,370
of course we're gonna use this a lot
307
00:13:34,370 --> 00:13:35,380
throughout the course,
308
00:13:35,380 --> 00:13:37,450
because, as I mentioned in the beginning,
309
00:13:37,450 --> 00:13:39,840
middleware is really a fundamental concept
310
00:13:39,840 --> 00:13:42,010
that's really important for a lot of stuff
311
00:13:42,010 --> 00:13:44,060
that we need in our applications.
312
00:13:44,060 --> 00:13:46,140
So we're almost done talking about middleware.
313
00:13:46,140 --> 00:13:48,070
Next up is the last one,
314
00:13:48,070 --> 00:13:49,823
which is aggregation middleware.
23030
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.