Python/FlaskからMongoDBを扱うpymongo勉強内容メモ

Flaskについて調べていると、けっこうMongoDBを使っている人が多かった気がします。特にpymongoとFlaskとの相性がいいらしい。スキーマレスで柔軟にデータを管理できたり、pythonの辞書型そのまま格納できる点が便利らしい。

MongoDBと会話してみる

まずはHomebrewでインストールして指示に従う。

$ brew install mongodb
$ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
$ mongod --config /usr/local/etc/mongod.conf
$ mongo --version
MongoDB shell version: 2.4.9

上記サイトにのっているのをやってみた。ちゃんと勉強するならドットインストールのレッスンをひと通り見たらいいと思う。

$ mongo
> use examDB
> db.Math.insert({Name : "Taro", Grade: "40"})
> db.Math.insert({Name : "Jiro", Grade: "100"})
> db.Math.insert({Name : "Saburo", Grade: "90"})
> db.English.insert({Name : "Taro"})
> db.English.insert({Name : "Jiro", Grade: "80"})
> db.English.insert({Name : "Saburo", Grade:"70"})
> db.Math.find()
{ "_id" : ObjectId("53311bde8009ff889a354064"), "Name" : "Taro", "Grade" : "40" }
{ "_id" : ObjectId("53311be48009ff889a354065"), "Name" : "Jiro", "Grade" : "100" }
{ "_id" : ObjectId("53311bea8009ff889a354066"), "Name" : "Saburo", "Grade" : "90" }
> db.English.find()
{ "_id" : ObjectId("53311c0e8009ff889a354067"), "Name" : "Taro" }
{ "_id" : ObjectId("53311c0e8009ff889a354068"), "Name" : "Jiro", "Grade" : "80" }
{ "_id" : ObjectId("53311c108009ff889a354069"), "Name" : "Saburo", "Grade" : "70" }
> exit
bye

なるほど。触ってみるとこちらで解説されてる説明

mongodbの構成は、すっごく簡単に言うと db - collection - {key1:value1, key2, value2, "_id":ObjcetId("~")} のJSONカラム(ObjectIdは自動生成される)

が何となく分かる。

この例では,

  • データベース:examDB
  • コレクション:Math, English
  • ドキュメント:名前と点数


その他、気づいたこと・役立ちそうなこと

  • MongoDBではテーブルのことをコレクションというらしい。
  • ObjectIDというのが 各ドキュメントに自動で割り当てられるらしい。
  • データはJSON形式(辞書型のようにKeyとValueの関係)で保持されるらしい。
  • コレクションを作らないとデータベースは作成されない。

mongodbコマンド

  • 一覧の表示: > show dbs
  • 新規作成・切り替え: > use (DB名)
  • 削除: > use (DB名) -> db.dropDatabase()


pythonからMongoDBを触ってみる

pythonからmongodb使うならpymongo使うそうです。

$ pip install pymongo
$ ipython
In [1]: from pymongo import MongoClient

In [2]: client = MongoClient()

In [3]: db = client['examDB']

In [4]: db.Math.insert({'Name' : 'Taro', 'Grade':'40'})
Out[4]: ObjectId('53311d34c1579418640f4149')

In [5]: db.Math.insert({'Name' : 'Jiro', 'Grade': '100'})
Out[5]: ObjectId('53311d34c1579418640f414a')

In [6]: db.Math.insert({'Name' : 'Saburo', 'Grade': '90'})
Out[6]: ObjectId('53311d36c1579418640f414b')

In [7]: db.English.insert({'Name' : 'Taro'})
Out[7]: ObjectId('53311d40c1579418640f414c')

In [8]: db.English.insert({'Name' : 'Jiro', 'Grade': '80'})
Out[8]: ObjectId('53311d40c1579418640f414d')

In [9]: db.English.insert({'Name' : 'Saburo', 'Grade':'70'})
Out[9]: ObjectId('53311d41c1579418640f414e')

In [10]: for data in db.Math.find():
   ....:          print(data)
   ....:
{u'Grade': u'40', u'_id': ObjectId('53311bde8009ff889a354064'), u'Name': u'Taro'}
{u'Grade': u'100', u'_id': ObjectId('53311be48009ff889a354065'), u'Name': u'Jiro'}
{u'Grade': u'90', u'_id': ObjectId('53311bea8009ff889a354066'), u'Name': u'Saburo'}
{u'Grade': u'40', u'_id': ObjectId('53311d34c1579418640f4149'), u'Name': u'Taro'}
{u'Grade': u'100', u'_id': ObjectId('53311d34c1579418640f414a'), u'Name': u'Jiro'}
{u'Grade': u'90', u'_id': ObjectId('53311d36c1579418640f414b'), u'Name': u'Saburo'}

In [11]: for data in db.Math.find({'Name':'Taro'}):
   ....:          print(data)
   ....:
{u'Grade': u'40', u'_id': ObjectId('53311bde8009ff889a354064'), u'Name': u'Taro'}
{u'Grade': u'40', u'_id': ObjectId('53311d34c1579418640f4149'), u'Name': u'Taro'}

In [12]: exit()

なるほど。なんとなく使い方は分かった。

参考


おわりに

自分用のメモということもあり、かなり雑になってしまいましたがとりあえず勉強内容はまとまったかな? 使ってみた感じ、スキーマレスっていうのは本当に手軽でいい。ユーザ管理とかはRDBの方がいいかもだけど次Webアプリ書く時はmongo使ってみたい。

次はRedisの勉強しようかな?

データベース徹底攻略 (WEB+DB PRESS plus)

データベース徹底攻略 (WEB+DB PRESS plus)