PythonでMongoDBで遊びます。shardingとかGridFSとか、MongoDB自体のお話はまた、きっと後日。
まずは、mongodbのインストール。
$ sudo port mongodb
MongoDBを動かします。Cassandraと違って一般ユーザで。
$ mongod --dbpath data
では、PythonでMongoDBを遊ぶためにpymongoをインストール。
$ pip install pymongo
さて、準備ができたので早速遊びましょう。MongoDBをインストールしたらmongoというインターラクティブシェルも一緒にインストールされます。これを使って、インターラクティブにmongodbを操作できます。でも、残念ながら今回はPythonのインターラクティブシェルで遊びます。
pymongoをインポートしたらMongoDBとのコネクションを取得します。localhostでデフォルトのポート番号で動いているので、Connectionの引数は省略しています。
>>> import pymongo
>>> conn = pymongo.Connection()
はい。それじゃ、MongoDBのデータベースに接続します。今回は、testと言うデータベースです。conn["test"]と書いてもいいです。データベースがあれば既存のものが使われ、なければ作られます。
>>> db = conn.test
>>> db
Database(Connection('localhost', 27017), u'test')
データベースができたらusersと言うテーブル相当のものを作ります。と言ってもアクセスするだけです。
>>> db.users
Collection(Database(Connection('localhost', 27017), u'test'), u'users')
では、nameにlirisでデータを保存します。Pythonの辞書がデータを指定します。最終的にはJSON、本当はBSONにデータはシリアライズされます。BSONについてはそのうち。
スキーマとかテーブルの定義とか難しいことは考えなくても、辞書にぺけぺけデータをセットしておけば、よきに計らって貰えます。この辺がRDBと違っていい加減、いや柔軟なところです。
>>> db.users.save({"name": "liris"})
ObjectId('4ca97e9dd013fd6412000000')
データを保存したので本当に保存されているか確認したくなるのが人情です。早速確認します。いますね。
>>> db.users.find_one()
{u'_id': ObjectId('4ca97e9dd013fd6412000000'), u'name': u'liris'}
それじゃ、もう一人。
>>> db.users.save({"name": "liris", "blog": "http://blog.liris.org"})
ObjectId('4ca97ecfd013fd6412000001')
で、データを確認します。今度はすべてのデータをなめ回してみます。
>>> for user in db.users.find():
... print user
...
{u'_id': ObjectId('4ca97e9dd013fd6412000000'), u'name': u'liris'}
{u'blog': u'http://blog.liris.org', u'_id': ObjectId('4ca97ecfd013fd6412000001'), u'name': u'liris'}
二匹に増えています。
それじゃ、tagsとして配列でデータを入れてあげます。
>>> db.users.save({"name": "ohtani", "tags": ["liris", "ariel"]})
ObjectId('4ca97fc5d013fd6412000002')
>>> for user in db.users.find():
... print user
...
{u'_id': ObjectId('4ca97e9dd013fd6412000000'), u'name': u'liris'}
{u'blog': u'http://blog.liris.org', u'_id': ObjectId('4ca97ecfd013fd6412000001'), u'name': u'liris'}
{u'_id': ObjectId('4ca97fc5d013fd6412000002'), u'name': u'ohtani', u'tags': [u'liris', u'ariel']}
タグの中身で検索です。
>>> db.users.find_one({"tags": "liris"})
{u'_id': ObjectId('4ca97fc5d013fd6412000002'),
u'name': u'ohtani',
u'tags': [u'liris', u'ariel']}
辞書の中にさらに辞書を入れてみます(Embedded Document)。
>>> db.users.save({"name": "master", "nature": {"always": u"遅刻", "often" : u"来ない"}})
ObjectId('4ca98098d013fd6412000003')
Embedded Documentの中身で検索するときは、「.」で連結します。ちなみに、Embedded Documentだけのコレクションを扱うことはできないです。
>>> db.users.find_one({"nature.always": u"遅刻"})
{u'_id': ObjectId('4ca98098d013fd6412000003'),
u'name': u'master',
u'nature': {u'always': u'遅刻', u'often': u'来ない'}}
lirisさんが2匹もいるとうざいので、こんなやつは一匹だけにします。まずは、いらなさそうなやつをみつけだして、
>>> user = db.users.find_one({"name": "liris", "blog": None})
>>> user
{u'_id': ObjectId('4ca97e9dd013fd6412000000'), u'name': u'liris'}
消えちまえ!の呪文を唱えます。消えています。
>>> db.users.remove(user)
>>> for user in db.users.find():
... print user
...
{u'blog': u'http://blog.liris.org', u'_id': ObjectId('4ca97ecfd013fd6412000001'), u'name': u'liris'}
{u'_id': ObjectId('4ca97fc5d013fd6412000002'), u'name': u'ohtani', u'tags': [u'liris', u'ariel']}
{u'_id': ObjectId('4ca98098d013fd6412000003'), u'name': u'master', u'nature': {u'always': u'遅刻', u'often': u'来ない'}}
切断しておしまい。
>>> conn.disconnect()
これで、きっと3分です。