Djamo Quick Start Guide
=======================
**Djamo** API is very similar to `PyMmongo `_, But **Djamo** provides an OOP way to use PyMongo. Let's begin
Definations and inserting data
------------------------------
.. highlight:: python
After installing **Djamo** you have to add some configuration data to ``settings.py`` file of your Djanog project. Add a settings variable called ``DJAMO`` to your settings and specify MongoDB connection information in that. for example::
DJAMO = {
"name": "test_database",
"host": "localhost", # This option is optional and its default value is 'localhost'
"port": 27017, # This option is optional and its default value is 27017
"max_pool_size": 10, # This option is optional and its default value is 10
"max_age": 1200, # This option is optional and its default value is 400, Djamo
# will keep alive the connection for max_age seconds
}
**Djamo** tries to stay as simple as possible, so it's very easy to use it. Djamo provides two main class to represent your data model. :py:class:`~djamo.document.Document` is the base class for representing a MongoDB document. :py:class:`~djamo.document.Document` is a **dict**
subclass and it's optional to use it, You can simply use a dictionary just like the way PyMongo do, But using :py:class:`~djamo.document.Document` brings you some useful advantages. For example you can
specify a ``fileds`` property for your :py:class:`~djamo.document.Document`, **Djamo** will use it for validate and serialize your data (Don't worry you will learn it soon).
Other useful class is :py:class:`~djamo.collection.Collection` which represent a MongoDB collection. As i told earlier in this document **Djamo** has a API very similar to **PyMongo**'s. So :py:class:`~djamo.collection.Collection` is a subclass of PyMongo Collection and share the same methods as PyMongo.
Let's see some examples, Here is a simple Document/Collection to represent a Student::
from djamo import Collection, Document
class Student (Document):
pass
class Students (Collection):
document = Student
It's easy, isn't it? The `Student` class is document with no specific property and `Students` class is a collection that use `Student` document as its default document. Each collection should define a ``document`` attribute which used for serializing and de-serializing collection data, if no document specified **Djamo** will use normal python dictionary to work with collections data. Now its time to use above
code and do some query on database::
student_a = Student({"name": "Uchiha Sasuke",
"age": 19})
student_b = Sudent(name="Uzumaki Naruto", age=18, uid=3975611745)
student_c = Student()
student_c.name = "Rock Lee"
student_c["age"] = 21
students = Students()
students.insert([student_a, student_b, student_c])
Here you can see that a :py:class:`~djamo.document.Document` subclass can be initialize eather by passing a dictionary or by using keyword argyments. Also you must know about how to access your document attributes, since document is a subclass of dict
class you can access to a document attributes eather using normal dictionary indexing or class attributes.
We used :py:func:`~djamo.collections.BaseCollection.insert` method of :py:class:`~djamo.collections.Collection` to put a list of students in our database. Remember documents are ``dict`` subclass and MongoDB did not force to stick with the same keys/values for your document, so your document can have any key/value pair your want. :py:func:`~djamo.collections.BaseCollection.insert` method will return a list of ``_id``s of
the inserted documents or `None` if ``manipulate`` is False.
.. note:: Returned ``_id`` value is an instance of **Object_id** class.
After inserting data it is time to update them. Assume you want to change the ``school`` key of some students with specific ``age``::
students = Students()
students.update_all({"age": 18}, {"$set": {"school": "school_A"}}) # update the school field of all the students with 'age' 18
students.update({"age": 18}, {"$set": {"school": "school_A"}}) # update the school field of the first student with 'age' 18
In above example we used :py:func:`~djamo.collection.Collection.update` to change the value of ``school`` key of all the students in the ``Students`` collection who are 18 years old, to ``school_A``. If they don't have a ``school`` key it will be created.
.. note:: Remember that **update()** only updatest he first matching document **by default** if you want to update all the documents you have to set the 'multi' parameter of ``update`` or use **update_all()** instead.
If you want to insert or update just one document, there is a shortcut that help you with that. :py:func:`~djamo.collections.BaseCollection.save` allow you to insert a new document or update an already exists document. for example::
new_student = Student(name="Aburame Shino", age=22)
students = Students()
students.save(new_student) # save will use insert to put data in database
new_student.age = 20
students.save(new_student) # save will use update to update the new_student age field
Making queries
--------------
After inserting some data in database you can access those data by making queries on related collection by using :py:func:`~djamo.collections.BaseCollection.find` and :py:func:`~djamo.collections.BaseCollection.find_one`.
Let's make it quick (we use Students collection and Student from above example)::
students = Students()
students.find({"age": 18}) # find all the students with age of 18
students.find_one({"age": 18}) # select only first matched student
You can use `query operators `_ of Mongodb for making advance queries
.. seealso:: For more information take a look at :py:class:`~djamo.collections.Collection`.
More ...
--------
Take a look at **Djamo** :doc:`api/index`