00:01 Let's look at how we can do some basic crud operations
00:03 and connect to MongoDb with Python via PyMongo.
00:06 So if we're going to use PyMongo, let's start by importing PyMongo,
00:10 and I'm going to not import the items or the classes out of this
00:14 but actually just the module and use the name space style
00:17 to make it really clear where this stuff comes from.
00:19 Actually I like to do this in a lot of my programs, even in production.
00:23 So we import PyMongo, and then we have to create a connection string
00:26 and feed it off to the pymongo.MongoClient, right
00:30 so this is a concrete class in PyMongo,
00:33 and we can give it any sort of connection string,
00:36 in fact if you give it no connection string, I think it'll use
00:38 what I have written here basically, no auth, no ssl,
00:41 local host 27017 which is the default standalone MongoDB port.
00:45 Alright, so this is cool, we've got our client here,
00:47 and now then it gets a little bit trippy,
00:49 a little bit dynamic here, which is kind of fun.
00:51 So the next thing we're going to do,
00:53 is we are going to go to the client, we're going to say . some database name,
00:56 not table name, database name.
00:58 Now, this thing doesn't even have to exist at this point
01:01 this, as you saw on the demo, is actually how we created
01:04 this database called the_small_bookstore,
01:06 we just said db = client.the_small_bookstore
01:09 and by basically saying that it exists, or implying that it exists
01:12 it's going to since we do some kind of write, or modifying operation to it.
01:16 Ok, so just be aware that this is case sensitive, right,
01:19 so capital T capital S capital B, would not be
01:22 the same database as lower case t s b.
01:25 Right, so let's go, and now we're going to actually do
01:27 a lot of things that look extremely similar to what we saw in the Javascript shell,
01:31 that's why I spent so much time in that section
01:33 it's because the apis are so, so similar at this level.
01:36 So now we can just operate on the database via collection
01:40 so just like we said client.database name,
01:42 we're going to say db . collection name
01:44 and those collections also don't necessarily have to exist,
01:47 even for queries, if they don't exist, you just get nothing back that's not an error.
01:51 So for example, we can do a query against the books collection
01:55 and ask how many there are, so db.books.count
01:58 and that'll tell us how many books there are
02:00 and like I said, even if the database doesn't exist,
02:03 if the collection doesn't exist or both, it's still going to work,
02:05 it will just return zero, because guess what,
02:07 there are no books in the nonexistent database.
02:10 We could do a find_one and this will pull back just one item
02:14 by whatever the default sort the MongoDB happens to be using
02:17 and we can say find_one and give it
02:21 one of these prototypical not json but Python dictionary type of objects.
02:25 Now this find one is the first place where we're seeing the Python api
02:28 ever so slightly vary from the Javascript api;
02:31 in Javascript it's findOne, and in Python it's find_one
02:38 and they've adapted the api to be pythonic, right,
02:41 it would look weird to say findOne,
02:44 but just be aware that they're not identical, you kind of have to keep in mind
02:47 which language you're working in, but other than that,
02:49 what you feed to it and how they work it's more or less the same.
02:52 If we want to insert something we say db.books.insert_one
02:57 and then we give it the document to insert
02:59 and we get a result and we saw that the result actually comes back
03:03 and has an inserted _id and the inserted _id is the generated id of the thing
03:09 that was autogenerated in the database, notice we didn't pass _id,
03:14 but if we care we can get it back for whatever purpose.
03:17 When working at higher levels with like MongoEngine,
03:19 this will automatically just happen on the class
03:21 and get set we won't have to worry about it.