|
|
00:01 So we have the primary properties of our car modeled,
|
|
|
00:04 they have their required fields, they have their default values, things like that.
|
|
|
00:08 We still maybe want to consider indexes
|
|
|
00:10 but we're saving that for a performance area.
|
|
|
00:12 The next thing we want to look at is the engine, and the embedded elements.
|
|
|
00:16 We talked about at the beginning that the car is going to have an engine,
|
|
|
00:20 and it's going to be equal to something,
|
|
|
00:22 not a string or a float or something like that,
|
|
|
00:25 but in fact, to an entire subclass, right,
|
|
|
00:28 a class that represents engines in particular,
|
|
|
00:30 so let's create that class and then we'll come back to the car.
|
|
|
00:33 So if we come over here, I'm going to create something called engine
|
|
|
00:37 and just like before, we are going to import MongoEngine,
|
|
|
00:41 not the same engine, right, class engine
|
|
|
00:44 and this is going to derive from MongoEngine document,
|
|
|
00:46 now, before I said document has the id
|
|
|
00:49 and this is like the top level thing that allows saving and loading,
|
|
|
00:51 so we don't use this type for embedded documents, subdocuments,
|
|
|
00:56 right, subdocuments don't necessarily have ids,
|
|
|
00:58 you don't load query and save them etc independently,
|
|
|
01:02 you can only work with them through their parent document,
|
|
|
01:05 so in this case, we are going to say this is only allowed as an embedded document
|
|
|
01:08 it can't be queried or saved directly, but it can be used
|
|
|
01:11 as a subelement of another type, like for example our car.
|
|
|
01:17 So let's go over here, and give our engine a couple of properties,
|
|
|
01:20 we're going to give it the horsepower
|
|
|
01:23 and the horsepower is going to be a mongoengine.integer,
|
|
|
01:28 so this is going to be an int field, it is going to have a leaders
|
|
|
01:31 so the size of the engine and this will be mongoengine float field
|
|
|
01:35 because it could have like 2.3 liter engine something like that;
|
|
|
01:40 we'll have the mpg, so miles per gallon,
|
|
|
01:44 and this is going to be the same thing, a float,
|
|
|
01:46 finally it'll have a serial number, and this is going to be a mongoengine string field.
|
|
|
01:55 And the serial number is kind of like the vin number,
|
|
|
01:58 but in fact it's not exactly the same, it's going to be having dashes
|
|
|
02:03 it will have a slightly different format, but let's go ahead
|
|
|
02:05 and work on some of the default values in that,
|
|
|
02:08 so we're going to import uuid, I am going to use just again uuid
|
|
|
02:12 to actually generate this so quick review, default is a lambda,
|
|
|
02:16 and the lambda is going to return a string representation of uuid4,
|
|
|
02:22 I believe the dash is in there this time, just to make sure
|
|
|
02:24 hey this is clearly not a vin number, it's a serial number.
|
|
|
02:28 And let's set these all to be required, so we can have in the subdocument itself
|
|
|
02:34 these required values, except for the serial number,
|
|
|
02:36 which is going to be autogenerated;
|
|
|
02:38 all right, so let's go back now that we have this not a document
|
|
|
02:41 but a subdocument, an embedded document, let's go back to the car
|
|
|
02:45 so in the car what am I going to set this to, a MongoEngine something,
|
|
|
02:48 right so this is not going to be a string or float or anything,
|
|
|
02:52 it's going to be an embedded document field,
|
|
|
02:54 right, so we have an embedded document list field or just a field
|
|
|
02:58 so this is a single engine, not a list of them, so here it goes like that
|
|
|
03:02 and then I need to tell it not just what goes in there, but the document type
|
|
|
03:06 what is the subdocument, the subdocument is actually this,
|
|
|
03:09 and then let's go ahead and say required = true
|
|
|
03:12 so we could even say that this subdocument cannot be
|
|
|
03:15 none or null in Javascript, it has to be set to a thing.
|
|
|
03:18 So, we're going to import the engine, so it knows the car,
|
|
|
03:22 it knows about the engine and it can save it there,
|
|
|
03:25 all right, let's try to work with our engine here and see what happens.
|
|
|
03:28 Okay, it runs, that's already pretty encouraging,
|
|
|
03:31 so the model is going to be the Testarossa,
|
|
|
03:34 I'm sure that's misspelled but we'll roll with it,
|
|
|
03:36 Ferrari, it was built in 2010 and this is going to crash
|
|
|
03:41 because the engine was not specified, how do we do that,
|
|
|
03:44 well let's jump right where the problem is and find out.
|
|
|
03:48 So we need to set the engine, now I'm just going to hardcore engine setting
|
|
|
03:52 so we don't ask this anymore, right, so we want to come over and say
|
|
|
03:56 allocate an engine, allocating it is just the same as the top level item
|
|
|
04:01 we'll say engine.horsepower is around six hundred horsepower,
|
|
|
04:04 that's pretty insane isn't it, we have the miles per gallon,
|
|
|
04:08 I think that's around 20, not super high, liters let's say 5.0
|
|
|
04:17 it's not exactly right, I'm sure but close enough;
|
|
|
04:20 and then we just say car.engine is engine, like this,
|
|
|
04:24 so we create this object and we associate it,
|
|
|
04:26 and then later we can say car.engine. and we get all the various things here.
|
|
|
04:30 Okay, so here we have our car, we set the engine and now let's do this again;
|
|
|
04:35 in fact, let me just comment this out a little bit,
|
|
|
04:40
|
|
|
04:42 yeah, we'll just ask those two questions, keep it little simpler.
|
|
|
04:45 Ok so we're going to add a car, the model is Testarossa,
|
|
|
04:49 don't think we have one yet, let's open up our shell,
|
|
|
04:53 we have the couple F40s and the 308, but no Testarossa,
|
|
|
04:59 2005, and boom, inserted, okay let's run this again.
|
|
|
05:06 Where did it go, oh there it is, check that out how awesome is that!
|
|
|
05:10 So we have our Testarossa 2008, the mileage defaulted to zero,
|
|
|
05:14 the vin number was autogenerated, now here we have our engine
|
|
|
05:18 and check this out, here is our subdocument
|
|
|
05:21 curly brace means object subdocument in json
|
|
|
05:24 so we have horse power 600, liters are 5,
|
|
|
05:26 miles per gallon is 20, serial number is such and such,
|
|
|
05:30 let's go and make a quick change here so we can ask some interesting questions,
|
|
|
05:34 let me make this 22, this is a more efficient version
|
|
|
05:38 and it only makes 590 horse power, okay let's just insert one more.
|
|
|
05:43 So we're going to add what model, so let's say 355
|
|
|
05:47 is that a thing, I'm not sure, 2000, like so.
|
|
|
05:51 So if we go over here and run this, now we have these two
|
|
|
05:57 that have engines, this one has a 590 and so on,
|
|
|
06:00 so we can actually go over here and ask interesting questions
|
|
|
06:03 like I want all the cars with an engine where,
|
|
|
06:06 let's go for liters, is we can say something like $ > what value, say 5.95
|
|
|
06:15 and of course, got to close everything off,
|
|
|
06:19 what did I miss— I missed something didn't I, because it didn't come back,
|
|
|
06:24 horse power could be that much or liters could be something much smaller
|
|
|
06:28 so here, horsepower this much, or liter, I could have done 4.5,
|
|
|
06:33 there you go, so now you can see that we can query down into this subdocument
|
|
|
06:37 but it's going to get more interesting when we start doing queries with MongoEngine,
|
|
|
06:40 because we want to get these rich objects back. |