MongoDB-engine on mielenkiintoinen Django-laajennus. Sen avulla MongoDB toimii Djangon tietokantana niin, että MySQL:ää (tai muita SQL-tietokantoja) ei tarvita ollenkaan.

Sovelluksia voi siis kehittää normaaliin tapaan Djangon tietomallien pohjalta. Sisäänrakennettu ylläpito toimii sellaisenaan. Periaatteessa kokonaisen MySQL:n varaan rakennetun Django-sovelluksen voi siirtää MongoDB:n päälle, joskin epäilemättä kaikenlaisia pieniä yhteensopivuuskysymyksiä tulee eteen.

Parasta näin ensikokeilemalla MongoDB:ssä on se, että Django-sovellusten tietomalleja voi muuttaa jatkuvasti, eikä muutoksia tarvitse mitenkään päivittää tietokannan schemaan. Minkäänlaisia ALTER TABLE -komentoja tai South-migraatioita ei siis tarvita, sillä MongoDB:ssä ei ole schemoja lainkaan. Tietomallin uudet kentät vain saavat automaattisesti default-arvonsa, mikäli kyseinen kenttä puuttuu tietokantaan aiemmin tallennetusta objektista.

Laajemmin katsoen itseäni kiinnostaa MongoDB:ssä myös sen skaalautuvuus. MongoDB toimii haluttaessa klusterina, joka osaa automaattisen shardauksen eli objektien hajauttamisen eri palvelinten kesken, kun niitä on tietokannassa suuria määriä. Esimerkiksi CouchDB ei tätä vielä osaa.

Asennus

Asennus osoittautui hieman kinkkiseksi, sillä MongoDB-enginestä on tällä hetkellä useita eri versioita erilaisine riippuvuuksineen. Tällainen yhdistelmä PyPi-paketteja ja Bitbucketista sekä GitHubista otettuja projekteja kuitenkin toimii:

pip install django gunicorn pymongo
rm -rf /tmp/djangotoolbox && hg clone https://bitbucket.org/wkornewald/djangotoolbo /tmp/djangotoolbox && cd /tmp/djangotoolbox && python setup.py install && cd - && rm -rf /tmp/djangotoolbox
rm -rf /tmp/django-nonrel && hg clone https://bitbucket.org/wkornewald/django-nonrel /tmp/django-nonrel && cd /tmp/django-nonrel && python setup.py install && cd - && rm -rf /tmp/django-nonrel
rm -rf /tmp/mongodb-engine && git clone git://github.com/django-mongodb-engine/mongodb-engine /tmp/mongodb-engine && cd /tmp/mongodb-engine && python setup.py install && cd - && rm -rf /tmp/mongodb-engine

On tietysti toivottavaa, että djangotoolbox, django-nonrel ja mongodb-engine saadaan PyPiin siten, että kaikki ovat asennettavissa yhdellä pip-komennolla.

Näiden pakettien lisäksi varsinaisen MongoDB-palvelimen pitää tietysti olla ennestään asennettuna. Ubuntussa tämä onnistuu helposti apt-getillä.

Djangon asetukset

Djangon käyttöönotto toimii muuten normaalisti, mutta tietokanta-asetuksiin pitää määritellä MongoDB-palvelin:

DATABASES = {
    'default': {
        'ENGINE': 'django_mongodb_engine',
        'NAME': 'mydatabase',
    }
}

Tämän lisäksi SITE_ID ei voi olla numeerinen, koska se on MongoDB:n ObjectId. Käytännössä täytyykin ensin ajaa syncdb ja katsoa, minkä ObjectId:n oletussaitti saa:

./manage.py syncdb
mongoexport -d mydatabase -c django_site
# connected to: 127.0.0.1
# { "_id" : { "$oid" : "4d3df9f7dc6c260b3d03001d" }, "domain" : "example.com", "name" : "example.com" }
# exported 1 records

Nyt tunniste voidaan kopioida settings.py:hyn:

SITE_ID = '4d3df9f7dc6c260b3d03001d'

Hieman on siis säätämistä, mutta loppujen lopuksi yllättävän toimivaa. Pyrin kommentoimaan jatkossa lisää, jos huomaan Djangossa ja MongoDB:ssä erityisiä toimimattomuuksia tai muuta huomionarvoista.