Eve: Building RESTful APIs with MongoDB and Flask Transcripts
Chapter: Why MongoDB?
Lecture: Why Mongo is a good match for REST
0:00 In this lecture, we are not going too deep
0:02 into what Mongo is and how it all works.
0:05 You can find all sorts of information about it on the internet.
0:09 There is also a Mongo installation lecture
0:11 in the appendix should you need details
0:14 on how to properly set it up on your machines.
0:16 You might be wondering though
0:19 why Mongo was picked as the default db engine for the Eve framework,
0:22 when there were in fact so many other options around,
0:25 especially in the SQL ecosystem.
0:28 After all, when the Eve project was started,
0:31 Mongo certainly wasn't as popular as it is today.
0:35 In fact, the No SQL world have just surfaced on the public scene back then.
0:40 In hindsight, I believe it proved to be a great choice,
0:44 but allow me a few minutes to explain why I thought
0:47 right from the beginning that Mongo was going to be
0:50 a perfect match for a RESTful service.
0:53 Mongo stores data in flexible Json like documents,
0:57 meaning, fields can vary from document to document
1:01 and data structure can easily be changed over time.
1:05 But more importantly, as you know,
1:07 RESTful services usually communicate with the clients via Json.
1:11 So let's look at a typical get request,
1:15 we have a client somewhere and it is accepting the Json media type.
1:19 On the other side, we have Mongo,
1:21 which is storing native Json documents as well.
1:25 So maybe we can push directly to the clients from Mongo?
1:29 Ideally, yes, there is little working wall
1:34 as Python dictionaries naturally map to Json documents.
1:37 The same holds true when clients are writing to the service.
1:42 Here is a post request,
1:45 Json coming from the client that is received from the service
1:48 validated and then stored on the database.
1:52 And what about queries?
1:55 Well, it turns out that in Mongo
1:58 queries are also represented as Json style documents.
2:01 Here we are looking at a query performing in the Mongo shell,
2:04 now, if you were in SQL world,
2:07 this will be a typical select all documents from table things
2:11 where x=3 and y=4.
2:15 As you can see, the actual query is in fact a Json document itself.
2:22 A Json document is the perfect candidate for a URL query definition, isn't it?
2:27 We still need to perform some validation,
2:30 then, we can simply forward a query to the database.
2:33 The result will be of course a Json document again.
2:37 So as you can see, we're essentially going to have Json all along the pipeline,
2:43 or, if you will, Mongo and the REST service are speaking the same language
2:48 and in general, mapping to and from the database feels more natural.
2:52 There is no need to involve any kind of ORMs
2:54 which would end up making the service more complex
2:58 and more importantly for us, will probably have an impact on performance.
3:03 As we mentioned already, Mongo is schemaless.
3:06 Now, this doesn't really mean that we don't need a schema.
3:10 most likely, we still want to validate what is coming into our system
3:15 so we want to define some validation rules for known fields
3:19 we will see that Eve actually also supports
3:22 storing of unknown fields and documents.
3:25 But that is an opt in.
3:27 By default, when you are storing data on your service
3:29 you're guaranteed that unknown fields are rejected,
3:32 still, not having to worry about updating your db schema
3:37 as your service and requirements evolve
3:39 is very powerful and allows for less downtime
3:42 not to mention migration headache.
3:46 Lastly, let's talk about transactions.
3:48 One complaint that you usually hear about most No SQL databases
3:52 is that they are not transactional.
3:54 That can be severely limiting depending on your usecase.
3:59 But, if you think about the REST architecture
4:02 and how the first principle of RESTful design
4:05 is the total lack of state on the service,
4:07 you see how transactions don't really pretain to REST services.
4:11 You usually end up performing as more atomic updates anyway
4:15 because that is the nature of REST services.
4:18 So yes, Mongo doesn't have transactions,
4:21 but RESTful services don't usually have them either, so no big deal there.