You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
4.4 KiB
Plaintext

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

00:01 Finally, let's talk about updating documents.
00:03 It's actually really really easy in Mongo Engine to update document,
00:06 once you get one back from the database
00:09 it could be either you've gotten one or you've gotten a whole list
00:12 and you just happen to be making a change to a particular one of them,
00:16 it doesn't really matter, so in this case like see in line three,
00:19 here we're getting a car, we're finding it by id, and we're saying first;
00:22 first of all, we are verifying that we got the car back;
00:25 on line five, we're like no, no car, error
00:28 but let's assume we got the car,
00:30 we're going to create one of these service records
00:32 and we're going to append it to the list that is the service history
00:34 and we want to push that down into the database,
00:37 we want to save that so all we have to do is call car.save
00:39 and it will actually push that down.
00:41 And we saw that there was a possible conflict,
00:44 a possible raise conditions at the database level
00:47 if this type of code or changes to other parts of that car
00:51 that some other operation was being done on the car with the same id
00:54 it's possible that we could overwrite those changes, maybe, not for sure,
00:58 depending on how everybody sort of changed different parts of the car,
01:01 but there could be a problem of saving this here.
01:04 So you want to careful when you're doing this,
01:07 but this works totally fine, most of the time, it depends on your situation
01:11 how actively you're changing, how much contention there is
01:14 for particular documents, but assuming the contention is low
01:17 we're going to be able to say get the car,
01:19 we should make the changes to it and call save,
01:21 and it'll push that right back to the database.
01:23 However, if the contention is high, you care about performance
01:26 or you really just want to take most advantage of MongoDB
01:30 both for safety and performance, you can use the in place updates.
01:34 Here you can see we have this owner object that we've introduced
01:38 and this is like the owner of the car,
01:41 so maybe we want to record how many times
01:43 has this owner been to our service shop,
01:46 owners could own more than one car,
01:48 and so maybe we want to know like for this particular person
01:52 they've been in ten times, even though they have a new car
01:54 that's only been in twice, so we're going to have this number of visits
01:57 which is an integer on the owner
01:59 and we can actually use the increment operator right on it like this
02:03 we can say owner objects id = customer id
02:06 that's like the primary key, then update one,
02:08 increment operator double underscore name of the field
02:10 so incremental_ _number of visits;
02:12 you can increment it by whatever you want
02:14 even a negative number which is really a decrement
02:16 but there's just the increment operator.
02:18 So basically add that number on the right the one here to the number of visits,
02:22 so this is cool for the individual operators
02:25 you can use set, you can use increment, some of those particular operators,
02:28 but if we're going to work with the set in our case
02:32 like we just saw we are adding a service record to a car
02:35 here we could do the same thing,
02:37 but we could do this in place with the push operator
02:39 instead of pulling the document back, adding it and saving it again,
02:42 so we want to create a service record, and this time we're going to say
02:45 card.objects again the queries the where clause if you will it's id is car id
02:52 and then we want to say update one and use the push operator
02:54 so push on to the service history this subdocument.
02:58 In this case, what we get back is the number of updated items
03:00 we set up date one so you can bet it's one or a zero
03:03 and if it's not one something went wrong.
03:06 So it supports in place updates with the individual value operators
03:11 like increment and so on, it also supports things like push and add to set
03:16 for working with sets or arrays in the documents.
03:20 This is both better in terms of safety because you get this transactional behavior
03:24 it's also better in terms of performance,
03:26 because you don't bring the document back
03:28 make changes and push it in, you just shove the delta down to the server.