00:01 Let's look at one final thing, I think it is not beautiful 00:03 but knowing about it and expecting it is really, really important, 00:07 not in the beginning, but as you evolve your application, 00:10 you'll end up with some funky complications. 00:13 I actually chose the cars that I wanted to update very, very carefully, 00:17 let me run this again, if I list the cars, notice here in particular state 00:22 far away from this Ferrari F40  from 2005, there's only one of those, right, 00:27 notice the id it's d15 and ends in 7e, if I try to list the cars again 00:31 there's that one but oh, it ends in ae, list the cars again— 00:36 now it's ending in a1, what is up with that? 00:43 Just to be clear, the other ones are not changing, 00:45 like 0f that's always the value, for the first one 0f, 00:51 there's not a problem with Mongo or anything like that, 00:54 what is going on here is this car was inserted into the database 00:59 when we just had a little bit of our class to find here, 01:02 remember in the beginning, we didn't have this default concept 01:06 when I first introduced it, and somewhere along the way 01:09 after we had inserted a few cars, then we added this, 01:12 let's look at Robomongo. 01:17 If you flip through here, you'll see almost all the cars have a vi number, 01:20 vehicle id number, vehicle id number 01:24 except for that F40 from 2005, right at the top— none. 01:29 Because when it was inserted, there was no definition for a vi number 01:34 what the heck was that thing anyway, 01:36 how was it supposed to know that was not here yet but would eventually exist; 01:39 so we can do a couple of things, 01:41 the reason you keep seeing this changing numbers is that there's a default value 01:45 and basically it gets created every time 01:50 it comes back from the serialization layer, 01:53 but it doesn't get set from the database 01:55 because there is nothing to set it to, 01:57 so every time it goes back, it reruns that lambda 01:59 and gets a new value and we're not saving it. 02:02 So basically what we need to do is we need to upgrade our documents, 02:04 now sometimes like I said, this doesn't matter, 02:07 but this one where we kind of counted on a default value to be there, 02:10 and then it wasn't, well that's unfortunate. 02:13 So here's something, there's a couple of things we could do, 02:17 I could simply come up here and write the script in Javascript 02:20 and apply that, that's one option, 02:22 another option is let's go here and let's write make sure 02:25 we just below configure Mongo I'll say update_doc_versions, or something like this 02:32 define that function here, and what we can do is something like this 02:37 it's not exactly in a work, but it'll give you the idea what we're after; 02:41 so we'll say for car in car.objects so basically 02:44 let's look through everything in this collection and let's save it back, 02:48 I'm going to run this, and let's list the cars and see if we solved it, 02:53 I really wish it wasn't at the top but there is, 19, 02 03:02 what's going on, well, it turns out that unless we somehow forcibly change this object 03:09 it's like hey, this object is not dirty and we don't need to push it in there. 03:12 03:16 And say mark as changed, vi number and let's try it again— 03:20 03:26 here we go, so we told it that it changed 03:30 sadly even though it generates a default value 03:32 it doesn't look back into the database which I guess would be super expensive, 03:37 it just says hey someone changed this, right 03:39 it didn't really trigger that, it came from the databases none and then we set it, 03:43 so it doesn't know to push that through, so you have to do this little bit of a trick here 03:46 to say mark has changed, and PyCharm says you're not supposed to do that, 03:52 let's just tell it hey, don't make me look bad, 03:55 we have to do this you understand it, right? 03:57 Very well, okay, so now we've got this save back to the database, 04:01 we only want to run this the one time, right, we don't want to run at all the time, 04:05 this is just like a one time upgrade of our documents 04:08 and if you have a 100 thousand records, probably fine, 04:11 if you have a billion records this is not how you want to do it, 04:14 you want to do some kind of in place updater or something better, write the script, 04:18 so let's run this again, and now we should see our car here, 04:23 this is the 2005 F40, you know what, 04:26 it is time for new tires, let's service this puppy. 04:30 Now we come down here and say I don't know how much new tires are in Ferrari, 04:33 but let's say they're 2000, new tires, 04:35 the customer is pretty happy they had the low profile ones they were looking for 04:39 but they could have been like a certain kind, who knows, whatever. 04:43 Perfect, that worked, now if we list our cars again, 04:46 you can see that this one that was basically, we couldn't get to 04:50 because its vin number kept changing is now fixed 04:54 and that's because when we reran that we said hey, 04:58 force of the default of the vin number in there, 05:01 notice that none of these other ones changed, 05:03 it did write them back to the database, but it wrote them back 05:06 in exactly the way they were before, so nothing changed there, 05:09 I'll just run it one more time, this second one is, 05:12 I'll just copy this and we can go pull it back in a second, 05:14 so if we put this back one more time, and then we try to service this car 05:23 one dollar test service they were pretty thrilled with that 05:30 here you can see the test service, okay. 05:37 So the ids are not changing when we do this, 05:39 it's just if they're not there they are created. 05:42 Alright, so if that seemed kind of annoying, I'm sure it was annoying, 05:46 but let's think how this would be in a relational database, 05:50 what would have happened if this was a say SQLAlchemy or something to that effect, 05:55 or if this was some other thing, we would have a lot more trouble 05:58 evolving from one to the next, right, 06:01 so we wouldn't have the problem of 06:03 hey here's a car that doesn't have a vin number, 06:05 because if we didn't actually go and manually changed the database 06:10 every time we added something here, when we added this 06:13 we would have had to go back to the database 06:17 and do like a migration or data transformation SQL query 06:20 to actually change and add this column, same thing for this, 06:23 but none of that was required, it was just this one case 06:26 where we went back in time that we had to do a little bit of work here. 06:29 So, sometimes you still have these scripts you've got to run, 06:32 sometimes you still have these changes, you got to do 06:35 and consider the version history, 06:37 but it's much much less often than with relational databases 06:41 where every little change requires a script 06:43 or it's just oops things are out of sync, bam we can no longer work, 06:46 but I did want to point that out to you that look, 06:49 you're going to have to be really careful, some of the time. 06:52 as these things evolve, how are you going to deal with the fact 06:54 that in the database there is this thing that has no vehicle id number. 06:58 If we're using PyMongo, it would have just come up as none 07:02 or key error or something like that, it would have been a little more obvious 07:06 but that's just one of the trade-offs you get with these ODMs.