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.

104 lines
6.3 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 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.