﻿1
00:00:01,100 --> 00:00:04,883
‫In this video, let's implement document updating.

2
00:00:06,250 --> 00:00:09,810
‫And so, here, in our update tour handler, let's start by

3
00:00:09,810 --> 00:00:11,803
‫making it an async function.

4
00:00:14,650 --> 00:00:18,250
‫Then, or try catch block, and so I'm doing this

5
00:00:18,250 --> 00:00:22,130
‫very quickly now, because we're already used to this

6
00:00:22,130 --> 00:00:22,963
‫at this point.

7
00:00:24,330 --> 00:00:25,180
‫Right?

8
00:00:25,180 --> 00:00:28,210
‫So this goes into the try block and then

9
00:00:28,210 --> 00:00:32,440
‫I simply get this one, here, from the catch block

10
00:00:33,450 --> 00:00:34,693
‫of this other function.

11
00:00:36,130 --> 00:00:37,653
‫All right, so.

12
00:00:39,230 --> 00:00:40,660
‫Here we go.

13
00:00:40,660 --> 00:00:42,430
‫And so now, what we need to do here

14
00:00:42,430 --> 00:00:44,620
‫at the beginning of this try block

15
00:00:44,620 --> 00:00:47,140
‫is to basically query for the document that

16
00:00:47,140 --> 00:00:50,580
‫we want to update and then update it, all right?

17
00:00:50,580 --> 00:00:51,730
‫And we can actually do that

18
00:00:51,730 --> 00:00:54,250
‫all in one command with mongoose.

19
00:00:54,250 --> 00:00:57,160
‫And, remember, again, that we're gonna update the tour

20
00:00:57,160 --> 00:00:59,370
‫based on an ID, okay?

21
00:00:59,370 --> 00:01:03,320
‫So, it's a similar situation like this one here,

22
00:01:03,320 --> 00:01:05,590
‫where we find by ID.

23
00:01:05,590 --> 00:01:08,130
‫And now, we can actually do something very similar,

24
00:01:08,130 --> 00:01:11,380
‫which is find by ID and update.

25
00:01:11,380 --> 00:01:13,713
‫So again, everything in one query.

26
00:01:14,600 --> 00:01:16,790
‫So, let's do tour.findByID

27
00:01:20,400 --> 00:01:22,963
‫and update.

28
00:01:24,150 --> 00:01:27,520
‫Okay, so, what do we need to pass in here?

29
00:01:27,520 --> 00:01:31,290
‫Well, of course, the ID, so that we can first find

30
00:01:31,290 --> 00:01:33,313
‫the document that is to be updated.

31
00:01:34,620 --> 00:01:39,030
‫So, just like before, that is req.params.ID,

32
00:01:39,030 --> 00:01:42,690
‫and then the data that we actually want to change.

33
00:01:42,690 --> 00:01:44,750
‫And that data will be in the body,

34
00:01:44,750 --> 00:01:46,763
‫just like in the post request.

35
00:01:48,430 --> 00:01:51,330
‫So req.body, okay?

36
00:01:51,330 --> 00:01:53,470
‫And then, actually as a third argument,

37
00:01:53,470 --> 00:01:57,050
‫we can also patch in some options, and we will do that.

38
00:01:57,050 --> 00:02:00,600
‫And the first option that I want to specify is new

39
00:02:01,540 --> 00:02:03,690
‫and set it to true.

40
00:02:03,690 --> 00:02:06,760
‫Because this way, then the new updated document

41
00:02:06,760 --> 00:02:08,870
‫is the one that will be returned.

42
00:02:08,870 --> 00:02:11,810
‫And since we want to send back that updated document

43
00:02:11,810 --> 00:02:14,410
‫to the client, we always want this method

44
00:02:14,410 --> 00:02:18,380
‫to actually return that new document, okay?

45
00:02:18,380 --> 00:02:22,160
‫So this way, it actually then makes sense to

46
00:02:22,160 --> 00:02:27,160
‫await this query and then save it to a new variable.

47
00:02:28,710 --> 00:02:30,720
‫So then simply call it tour here,

48
00:02:30,720 --> 00:02:34,743
‫and then again, await the result of this query.

49
00:02:35,640 --> 00:02:38,200
‫So all of these methods that we've been using on the tour

50
00:02:38,200 --> 00:02:41,923
‫so far, so find by ID and update, or,

51
00:02:43,220 --> 00:02:47,300
‫well, not really create, but find by ID or find,

52
00:02:47,300 --> 00:02:51,350
‫all of these will return queries, so they are query methods

53
00:02:51,350 --> 00:02:53,320
‫and let me actually show that to you

54
00:02:53,320 --> 00:02:55,700
‫in the mongoose documentation.

55
00:02:55,700 --> 00:02:58,510
‫So, up until this point, we didn't have a look at

56
00:02:58,510 --> 00:03:00,300
‫the documentation so far.

57
00:03:00,300 --> 00:03:01,850
‫And so, let's quickly do that.

58
00:03:01,850 --> 00:03:05,080
‫So, on the model, which in our case is tour,

59
00:03:05,080 --> 00:03:07,610
‫we have all these query methods, right?

60
00:03:07,610 --> 00:03:11,920
‫So you see find, you see find one, you see find by ID,

61
00:03:11,920 --> 00:03:14,530
‫which is just a shorthand for find one.

62
00:03:14,530 --> 00:03:17,460
‫Then you see find by ID and update,

63
00:03:17,460 --> 00:03:19,320
‫which is the one that we're currently using,

64
00:03:19,320 --> 00:03:22,018
‫and which, in fact, is just a shorthand for

65
00:03:22,018 --> 00:03:26,440
‫find one and update, where we're querying for an ID,

66
00:03:26,440 --> 00:03:30,380
‫so similar to what we had in the last lecture, okay?

67
00:03:30,380 --> 00:03:33,630
‫And actually we can click on any one of these,

68
00:03:33,630 --> 00:03:36,340
‫so let's do the one that we're using currently,

69
00:03:36,340 --> 00:03:39,931
‫and that will then really take us to the API documentation

70
00:03:39,931 --> 00:03:43,560
‫which shows us how to really use a certain method.

71
00:03:43,560 --> 00:03:46,650
‫So you see that we passed the ID, so the value,

72
00:03:46,650 --> 00:03:50,550
‫off the ID to query by, we passed the object with

73
00:03:50,550 --> 00:03:55,320
‫the data to be updated, and we passed an options object.

74
00:03:55,320 --> 00:03:57,410
‫And down here we can actually see

75
00:03:57,410 --> 00:03:59,770
‫the options that we can set, so remember,

76
00:03:59,770 --> 00:04:03,360
‫we just set new to true, and so as it says here

77
00:04:03,360 --> 00:04:06,570
‫that will then return the modified document

78
00:04:06,570 --> 00:04:08,480
‫rather than the original.

79
00:04:08,480 --> 00:04:11,500
‫Now, another one that we actually want to set to true

80
00:04:11,500 --> 00:04:15,690
‫is this run validators, so that each time that we update

81
00:04:15,690 --> 00:04:19,160
‫a certain document, then the validators that we specified

82
00:04:19,160 --> 00:04:22,334
‫in the schema will run again, okay?

83
00:04:22,334 --> 00:04:26,050
‫And we will talk a lot about validators and validation

84
00:04:26,050 --> 00:04:27,600
‫a bit later in the section,

85
00:04:27,600 --> 00:04:31,770
‫but I'm gonna leave it here for now so that we, basically,

86
00:04:31,770 --> 00:04:32,743
‫don't forget it.

87
00:04:34,340 --> 00:04:35,530
‫Okay?

88
00:04:35,530 --> 00:04:38,810
‫Give it a save now, and actually I wanna go back here

89
00:04:38,810 --> 00:04:40,880
‫just to show you how many methods

90
00:04:40,880 --> 00:04:43,210
‫we actually have in mongoose.

91
00:04:43,210 --> 00:04:46,250
‫So, on the model, we have all of these methods here

92
00:04:46,250 --> 00:04:47,753
‫that you see in this list.

93
00:04:48,620 --> 00:04:51,300
‫So for example we used create before,

94
00:04:51,300 --> 00:04:52,833
‫we also used find.

95
00:04:53,850 --> 00:04:54,683
‫Okay?

96
00:04:54,683 --> 00:04:57,090
‫And so the ones that you see here in the top,

97
00:04:57,090 --> 00:04:59,350
‫they are available right on the model,

98
00:04:59,350 --> 00:05:01,363
‫and that, in our case, is the tour.

99
00:05:02,300 --> 00:05:04,320
‫Now, down here you, for example also see

100
00:05:04,320 --> 00:05:08,520
‫model.prototype.safe for example.

101
00:05:08,520 --> 00:05:10,770
‫And this one, we actually also already used

102
00:05:10,770 --> 00:05:14,290
‫right when we first started to work with mongoose.

103
00:05:14,290 --> 00:05:16,650
‫So I'm not sure if you are familiar with this,

104
00:05:16,650 --> 00:05:20,070
‫but in java script model.prototype always means

105
00:05:20,070 --> 00:05:23,560
‫an object created from a class, or in this case,

106
00:05:23,560 --> 00:05:25,330
‫created from a model.

107
00:05:25,330 --> 00:05:29,010
‫And so, the save method here, refers to a save method

108
00:05:29,010 --> 00:05:32,530
‫called on a document and not on a tour.

109
00:05:32,530 --> 00:05:35,370
‫And remember that that's exactly what we did.

110
00:05:35,370 --> 00:05:37,670
‫And I think I still have it here as a comment.

111
00:05:40,430 --> 00:05:41,550
‫Yeah, right here.

112
00:05:41,550 --> 00:05:45,717
‫So, we had a tour, this new tour variable here

113
00:05:45,717 --> 00:05:48,600
‫which was created from the tour model,

114
00:05:48,600 --> 00:05:53,220
‫and so this new tour here got access to the save method

115
00:05:53,220 --> 00:05:57,320
‫because that is part of the prototype object of this class.

116
00:05:57,320 --> 00:06:00,280
‫All right, now I don't want to bore you with the

117
00:06:00,280 --> 00:06:02,760
‫fundamentals of java script, but it is important

118
00:06:02,760 --> 00:06:05,620
‫in order to understand the documentation, okay?

119
00:06:05,620 --> 00:06:09,320
‫Because at some point you will need to use documentation,

120
00:06:09,320 --> 00:06:11,520
‫because mongoose is yute.

121
00:06:11,520 --> 00:06:13,700
‫And I will actually teach you a lot of the stuff

122
00:06:13,700 --> 00:06:16,520
‫that's important in there through all of this course,

123
00:06:16,520 --> 00:06:19,240
‫but sometimes you will still need something that

124
00:06:19,240 --> 00:06:20,740
‫I didn't show you in this course.

125
00:06:20,740 --> 00:06:23,060
‫And so it's important that you really understand

126
00:06:23,060 --> 00:06:25,900
‫the documentation as well, okay?

127
00:06:25,900 --> 00:06:29,360
‫And so, again, when you see model.prototype here,

128
00:06:29,360 --> 00:06:31,810
‫you know that the save method here

129
00:06:31,810 --> 00:06:34,800
‫is going to be available on all of the instances

130
00:06:34,800 --> 00:06:37,330
‫created through a model, okay?

131
00:06:37,330 --> 00:06:39,160
‫And so, not the model itself.

132
00:06:39,160 --> 00:06:42,000
‫So, for example, if you tried tour.save

133
00:06:42,000 --> 00:06:43,660
‫you wouldn't be able to use it.

134
00:06:43,660 --> 00:06:46,960
‫It would give you an error, but instead, if you tried save

135
00:06:46,960 --> 00:06:49,700
‫on a document created through the tour,

136
00:06:49,700 --> 00:06:52,120
‫then it would, of course, work, okay?

137
00:06:52,120 --> 00:06:53,840
‫I hope that makes sense.

138
00:06:53,840 --> 00:06:56,670
‫And, anyway, you see that we have a lot of other stuff,

139
00:06:56,670 --> 00:07:00,310
‫so we have to query, which we already talked about,

140
00:07:00,310 --> 00:07:04,030
‫because, for example, find by ID and update, or find,

141
00:07:04,030 --> 00:07:08,320
‫or find by ID, all of these will return query objects.

142
00:07:08,320 --> 00:07:10,860
‫And so, later on, when we're gonna implement stuff like

143
00:07:10,860 --> 00:07:15,150
‫sorting or filtering we will then use this query object.

144
00:07:15,150 --> 00:07:15,983
‫Okay?

145
00:07:15,983 --> 00:07:19,751
‫So, let's go back, we kind of got off the track here

146
00:07:19,751 --> 00:07:22,210
‫by looking at the documentation,

147
00:07:22,210 --> 00:07:24,230
‫but, again, I think it's really important

148
00:07:24,230 --> 00:07:26,370
‫to start looking at the documentation,

149
00:07:26,370 --> 00:07:29,670
‫because a course like this can only take you so far,

150
00:07:29,670 --> 00:07:32,570
‫and I hope you already know that at this point, okay?

151
00:07:32,570 --> 00:07:35,810
‫It's really important that you're also able to

152
00:07:35,810 --> 00:07:38,450
‫find information on your own, and I wanna show you how

153
00:07:38,450 --> 00:07:40,560
‫to do that also in this course.

154
00:07:40,560 --> 00:07:43,460
‫Anyways, let's now actually also send

155
00:07:43,460 --> 00:07:46,820
‫this newly updated tour back to the client,

156
00:07:46,820 --> 00:07:49,690
‫which, right now, we're not doing, because we have

157
00:07:49,690 --> 00:07:52,810
‫simply this updated tour here string.

158
00:07:52,810 --> 00:07:56,470
‫So let's get rid of that and simply send to tour.

159
00:07:56,470 --> 00:08:00,140
‫And remember that this, in fact, is actually this.

160
00:08:00,140 --> 00:08:03,940
‫So, the tour property is set to the tour object,

161
00:08:03,940 --> 00:08:07,360
‫but, thanks to ES6, we no longer have to do that

162
00:08:07,360 --> 00:08:11,160
‫when the property name has the same name of the value.

163
00:08:11,160 --> 00:08:13,310
‫Okay, so let's get rid of that.

164
00:08:13,310 --> 00:08:15,413
‫That makes our code look a bit better.

165
00:08:17,350 --> 00:08:19,373
‫Okay, and let's now test it.

166
00:08:20,980 --> 00:08:25,980
‫Back to postman, here we have the updated tour route.

167
00:08:26,079 --> 00:08:27,960
‫And so, let's actually do it

168
00:08:27,960 --> 00:08:30,983
‫on this same ID that we used before.

169
00:08:34,310 --> 00:08:35,550
‫So, this one.

170
00:08:35,550 --> 00:08:38,827
‫Then we come to the body, here, and let's change--

171
00:08:39,761 --> 00:08:42,250
‫Well, what are we gonna change here?

172
00:08:42,250 --> 00:08:46,493
‫Well, let's change the price to, like, 500.

173
00:08:48,040 --> 00:08:51,383
‫So, price, 500,

174
00:08:52,630 --> 00:08:55,700
‫send it, and indeed this gives us

175
00:08:55,700 --> 00:08:58,250
‫the newly updated object with the price

176
00:08:58,250 --> 00:09:00,730
‫already set to 500.

177
00:09:00,730 --> 00:09:03,410
‫And if we now get all tours, then that, of course,

178
00:09:03,410 --> 00:09:05,150
‫should be reflected here.

179
00:09:05,150 --> 00:09:06,480
‫And here it is.

180
00:09:06,480 --> 00:09:09,223
‫But now, let's say that we set it to a string.

181
00:09:13,930 --> 00:09:15,920
‫Let's take a look at what happens, then.

182
00:09:15,920 --> 00:09:17,930
‫Well, then we actually get an error.

183
00:09:17,930 --> 00:09:21,090
‫And that's because we ran the validators again.

184
00:09:21,090 --> 00:09:23,497
‫So, remember that we have--

185
00:09:24,900 --> 00:09:25,760
‫Where is that?

186
00:09:27,720 --> 00:09:28,553
‫Oh yeah, here.

187
00:09:28,553 --> 00:09:32,070
‫So here we specify that the validators should be run again.

188
00:09:32,070 --> 00:09:36,130
‫And so, right now the price is no longer a number

189
00:09:36,130 --> 00:09:38,050
‫as it is expected, right?

190
00:09:38,050 --> 00:09:41,580
‫So in a schema we say that the price should be a number,

191
00:09:41,580 --> 00:09:44,580
‫but, of course, java script, or mongoose, actually,

192
00:09:44,580 --> 00:09:49,290
‫cannot, basically, convert this string here to a number.

193
00:09:49,290 --> 00:09:50,820
‫But that is what we expect.

194
00:09:50,820 --> 00:09:53,350
‫So here it says kind should be number.

195
00:09:53,350 --> 00:09:55,580
‫And so, therefor, it gives us an error,

196
00:09:55,580 --> 00:09:58,540
‫simply because we're running the validators again.

197
00:09:58,540 --> 00:10:01,530
‫So, let's put it back to 500 and then, of course,

198
00:10:01,530 --> 00:10:02,730
‫it's gonna be back.

199
00:10:02,730 --> 00:10:05,430
‫All right, now, keep in mind that we're actually

200
00:10:05,430 --> 00:10:07,750
‫doing a patch request here.

201
00:10:07,750 --> 00:10:11,000
‫Now, if we were doing a put request, remember,

202
00:10:11,000 --> 00:10:13,670
‫then you would expect that the original object

203
00:10:13,670 --> 00:10:15,190
‫would be completely replaced

204
00:10:15,190 --> 00:10:18,150
‫with the new one that is sent in, okay?

205
00:10:18,150 --> 00:10:20,280
‫So, in that case it would no longer work

206
00:10:20,280 --> 00:10:22,272
‫the way we implemented here

207
00:10:22,272 --> 00:10:25,420
‫because this one simply really updated the fields

208
00:10:25,420 --> 00:10:29,360
‫that are different here in the body, okay?

209
00:10:29,360 --> 00:10:32,150
‫But anyways, I think that the patch method

210
00:10:32,150 --> 00:10:34,400
‫is actually way more useful, and so,

211
00:10:34,400 --> 00:10:38,490
‫that's gonna be the only one that implementing here.

212
00:10:38,490 --> 00:10:42,300
‫Cool, so we have three of our four correct operations

213
00:10:42,300 --> 00:10:44,910
‫implemented, only one more left to go,

214
00:10:44,910 --> 00:10:46,463
‫which is gonna be delete.

