Last time we showed you how to setup up your environment.
In the next few episodes we will take you through the standard CRUD operators that every database is expected to support. In this episode we will focus on the Create in CRUD.
Create
Lets look at how we insert JSON documents into MongoDB.
First lets start a local single instance of mongod
using m.
$ m use stable
2018-08-28T14:58:06.674+0100 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2018-08-28T14:58:06.689+0100 I CONTROL [initandlisten] MongoDB starting : pid=43658 port=27017 dbpath=/data/db 64-bit host=JD10Gen.local
2018-08-28T14:58:06.689+0100 I CONTROL [initandlisten] db version v4.0.2
2018-08-28T14:58:06.689+0100 I CONTROL [initandlisten] git version: fc1573ba18aee42f97a3bb13b67af7d837826b47
2018-08-28T14:58:06.689+0100 I CONTROL [initandlisten] allocator: syste
etc...
The mongod
starts listening on port 27017
by default. As every MongoDB driver
defaults to connecting on localhost:27017
we won't need to specify a connection string explicitly in these early examples.
Now, we want to work with the Python driver. These examples are using Python 3.6.5 but everything should work with versions as old as Python 2.7 without problems.
Unlike SQL databases, databases and collections in MongoDB only have to be named to be created. As we will see later this is a lazy creation process, and the database and corresponding collection are actually only created when a document is inserted.
$ python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 03:03:55)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import pymongo
>>> client = pymongo.MongoClient()
>>> database = client[ "ep002" ]
>>> people_collection = database[ "people_collection" ]
>>> result=people_collection.insert_one({"name" : "Joe Drumgoole"})
>>> result.inserted_id
ObjectId('5b7d297cc718bc133212aa94')
>>> result.acknowledged
True
>>> people_collection.find_one()
{'_id': ObjectId('5b62e6f8c3b498fbfdc1c20c'), 'name': 'Joe Drumgoole'}
True
>>>
First we import the pymongo
library (line 6). Then we create the local client proxy object,
client = pymongo.MongoClient()
(line 7) . The client object manages a connection pool to the server and can be used to set many operational parameters related to server connections.
We can leave the parameter list to the MongoClient
call blank. Remember, the server by default listens on port 27017
and the client by default attempts to connect to localhost:27017
.
Once we have a client
object, we can now create a database, ep002
(line 8)
and a collection, people_collection
(line 9). Note that we do not need an explicit DDL statement.
Using Compass to examine the database server
A database is effectively a container for collections. A collection provides a container for documents. Neither the database nor the collection will be created on the server until you actually insert a document. If you check the server by connecting MongoDB Compass you will see that there are no databases or collections on this server before the insert_one
call.
These commands are lazily evaluated. So, until we actually insert a document into the collection, nothing happens on the server.
Once we insert a document:
>>>> result=database.people_collection.insert_one({"name" : "Joe Drumgoole"})
>>> result.inserted_id
ObjectId('5b7d297cc718bc133212aa94')
>>> result.acknowledged
True
>>> people_collection.find_one()
{'_id': ObjectId('5b62e6f8c3b498fbfdc1c20c'), 'name': 'Joe Drumgoole'}
True
>>>
We will see that the database, the collection, and the document are created.
And we can see the document in the database.
_id Field
Every object that is inserted into a MongoDB database gets an automatically
generated _id
field. This field is guaranteed to be unique for every document
inserted into the collection. This unique property is enforced as the _id field
is automatically indexed
and the index is unique.
The value of the _id
field is defined as follows:
The _id
field is generated on the client and you can see the PyMongo generation code in the objectid.py file. Just search for the def _generate
string. All MongoDB drivers generate _id
fields on the client side. The _id
field allows us to insert the same JSON object many times and allow each one to be uniquely identified. The _id
field even gives a temporal ordering and you can get this from an ObjectID via the generation_time method.
>>> from bson import ObjectId
>>> x=ObjectId('5b7d297cc718bc133212aa94')
>>> x.generation_time
datetime.datetime(2018, 8, 22, 9, 14, 36, tzinfo=)
>>> <b>print(x.generation_time)</b>
2018-08-22 09:14:36+00:00
>>>
Wrap Up
That is create in MongoDB. We started a mongod
instance, created a MongoClient
proxy, created a database and a collection and finally made then spring to life by inserting a document.
Next up we will talk more about Read part of CRUD. In MongoDB this is the find
query which we saw a little bit of earlier on in this episode.
For direct feedback please pose your questions on twitter/jdrumgoole that way everyone can see the answers.
The best way to try out MongoDB is via MongoDB Atlas our Database as a Service. It’s free to get started with MongoDB Atlas so give it a try today.