|
|
00:01 So we are able to service these cars,
|
|
|
00:03 however, there is something we might consider,
|
|
|
00:05 it's probably fine for this type of application,
|
|
|
00:08 but if there is contention around these documents,
|
|
|
00:11 like multiple things that you're trying to update the same record
|
|
|
00:14 you could run into some trouble here, right,
|
|
|
00:16 we could have two separate threads, run this part,
|
|
|
00:18 they could each enter some stuff here,
|
|
|
00:22 there's actually because the input has super long delay here,
|
|
|
00:24 and then we append it and save, and which every one got saved last
|
|
|
00:27 would replace the other one and just throw that data away.
|
|
|
00:31 We could add optimistic concurrency by manually implementing it
|
|
|
00:34 and that would solve that problem,
|
|
|
00:36 but we could actually make this perform better
|
|
|
00:38 as well as avoid that problem entirely,
|
|
|
00:41 so let's come over here and let's duplicate this, so hit command d in PyCharm,
|
|
|
00:46 control d on the other Oss, so let's come down here and do this entirely different,
|
|
|
00:53 so we're going to get rid of this part here,
|
|
|
00:56
|
|
|
00:59 and instead of saying this, since we're not pulling back the car,
|
|
|
01:02 let's actually drop this bit here, so you can compare them directly,
|
|
|
01:06 so we're going to ask for the vin, we're going to create the service history
|
|
|
01:11 and now, instead of pulling the record back,
|
|
|
01:14 making a change and pushing the entire document
|
|
|
01:17 which could be like 200 K, we just want to move this data over,
|
|
|
01:21 remember that in the raw api, we talked about the operators,
|
|
|
01:24 we had $addToSet, and $push, so we want to use those operators
|
|
|
01:35 and just say here, this service record put it onto the list
|
|
|
01:37 that is on that document under service history;
|
|
|
01:41 so that's what we're going to do now instead,
|
|
|
01:44 so we're going to go car and I need to find an individual car,
|
|
|
01:47 so I am going to do a query here, so I'll say vi number = vin, right,
|
|
|
01:54 just like we did in our find up here, but instead of pulling it back
|
|
|
01:57 we're going to take this and say update one,
|
|
|
02:01 when we update one, I want to say something like say service history
|
|
|
02:04
|
|
|
02:09 and we'll say service, but how do I tell it to use the operator,
|
|
|
02:12 this is the first time we've seen this but this,
|
|
|
02:14 but this pattern you'll see recur over and over and over in MongoEngine,
|
|
|
02:17 how do I tell it to use the operator?
|
|
|
02:19 You'll see that there's a couple of times, a couple different situations
|
|
|
02:22 where MongoEngine uses double underscores
|
|
|
02:25 to like represent, not just the value but the value with an operator
|
|
|
02:30 so the first one that are going to see is this push,
|
|
|
02:33 we'll say push double underscore, and what that means is
|
|
|
02:36 we're going to push service onto service history.
|
|
|
02:39
|
|
|
02:44 Up here before we had a way to say if you gave us the wrong vehicle id number
|
|
|
02:48 we told you no, there's no car with this,
|
|
|
02:51 there's no car with this bad vi vehicle id number;
|
|
|
02:56 so what do we do here— well, this doesn't pull it back
|
|
|
03:00 it just updates it if it finds it, so how is this going to work?
|
|
|
03:04 We need to put our test over here and say if it wasn't updated
|
|
|
03:08 so updated is if it comes back with one, but if it comes back with zero,
|
|
|
03:11 that is a problem, the exact same problem
|
|
|
03:14 we couldn't find the car with the vehicle id number;
|
|
|
03:16 so now we don't need to append this and push the whole document back
|
|
|
03:20 it's all in one shot atomically on the server.
|
|
|
03:23 Beautiful, so this is a much higher performance and safer thing to do
|
|
|
03:27 if we don't want any details about the car,
|
|
|
03:29 we literally just know that this service goes on that service history for that thing,
|
|
|
03:33 let's try again and see if it works.
|
|
|
03:36 So first lease the cars, I'll grab the id of the Testarossa,
|
|
|
03:40 and let's try to service it— the price is one two three,
|
|
|
03:44 the type of service is waxing, so we decided to wash it for them,
|
|
|
03:49 our customer thought the glean on that car
|
|
|
03:51 was like nobody's business, very happy,
|
|
|
03:53 there's the moment of truth, ready— boom, car with id not found,
|
|
|
03:58 oh, it totally worked, it totally worked,
|
|
|
04:04 I just have the wrong error message, wrong case here,
|
|
|
04:06 let's do a listing and run it again do a list,
|
|
|
04:12 now we have our waxing, what did I do wrong—
|
|
|
04:15 there's a lot of ways we could check it,
|
|
|
04:18 but if updated is exactly the one we don't want,
|
|
|
04:20 I could say if not updated or if updated equal zero
|
|
|
04:23 or if updated less than or equal to zero, things like this,
|
|
|
04:26 let's just go with == zero
|
|
|
04:30 alright, let's try it again, so we'll list our cars,
|
|
|
04:32 notice I still have this, so we'll go on service it,
|
|
|
04:36 I'll say I want to update this, the price is twelve dollars,
|
|
|
04:39 this is going to be just the check up and the customer thought
|
|
|
04:44 something was wrong, we couldn't find it, so they give us a three.
|
|
|
04:47 So, see, did it work, notice there were no errors
|
|
|
04:50 and now the checkup twelve dollars,
|
|
|
04:53 also notice the order here is literally the order that we're putting onto that list,
|
|
|
04:57 so very very good, we'll do one more, I guess I'll service something bad
|
|
|
05:01
|
|
|
05:06 car with bad then not found, all right now, sorry about that, we got this working.
|
|
|
05:12 So we used the push underscore underscore
|
|
|
05:15 now the other one, remember I told you about pythonic versus non pythonic
|
|
|
05:19 you could use add to set, right if you want to do sort of a uniqueness thing
|
|
|
05:25 the service history is because of the date field
|
|
|
05:28 and I'm not even ensure about the embedded objects
|
|
|
05:31 but certainly, the date field is always different,
|
|
|
05:33 so there's no point in this, just do a push,
|
|
|
05:35 but if you are pushing like tags or customer ids or something like that
|
|
|
05:38 which could easily be determined if there is a duplicate
|
|
|
05:41 then you could use that ad to set, but remember in Javascript
|
|
|
05:44 it was add to set like this, here it's the pythonic variant as it probably should be.
|
|
|
05:50 Okay, so depending on how you're working with your objects
|
|
|
05:55 this might make sense or this might make sense,
|
|
|
05:58 I guess I would tend to say prefer this one, this is safer and faster,
|
|
|
06:03 so if you have no real reason to choose one or the other,
|
|
|
06:05 why not safer why not faster. |