読者です 読者をやめる 読者になる 読者になる

MongoDBのORM MongoEngine part.1

MongoDBのORM(python)であるMongoEngineについて日本語の情報がほとんど無いので記事を書いてみます。
part.1ではインストール、ドキュメント定義、インデックスについて、part.2ではクエリについて書く予定。

インストール

内部でpymongoを使っているのでどちらもインストールします
pip install pymongo
pip install mongoengine

2014年1月時点では0.8系がインストールされます。
0.8で大幅な変更があったため0.7と0.8は互換性がありませんので、0.7以前のバージョンを既にインストールしている人は0.8に上げておいた方がいいです。

簡単なチュートリアル

#接続
from mongoengine import *
connect("db_name", host="localhost", port=27017)

#Userというドキュメントを設定
#idは自動で作られます
class User(Document):
    name = StringField() #文字列型
    user_number =  IntField() #Int型

#保存
user = User()
user.name = "太朗"
user.user_number = 3
user.save()

マルチデータベース(Multiple Databases)

接続先のDBを変える事ができます
通常のデータを扱うドキュメントはSSDに、画像など容量の大きいデータを扱うドキュメントはHDDに保存する場合なんかに使えます

connect("db1" , port=27017) #これが通常のDB alias="default"ということ
connect("db2", alias='db2' , port=27018)  #これが追加のマルチDB ailiasを設定

#model マルチDBを使うmodelのみ設定
class User(Document):
    meta = {"db_alias": "db2" }

フィールド

http://docs.mongoengine.org/guide/defining-documents.html#fields

よく使うのはこんなところでしょうか
ObjectIdField
StringField
IntField
DictField
ListField
BinaryField #バイナリ型
BooleanField #True or False
ReferenceField

インデックス

http://docs.mongoengine.org/en/latest/guide/defining-documents.html#indexes

Userドキュメントのnameにインデックスを張る場合
基本的にmeta要素に記述

class User(Document):
    meta = {
        "indexes" : ["name"] #一つの場合でもリストを使う
    }
    name = StringField() 


以下詳細

["name" , "name2" ] #nameとname2にそれぞれインデックス

[ ( "name" , "name2") ] #nameとname2の複合インデックス 順序も考慮されます
[ "name" , ( "aaa" , "-bbb") ] #bbbを逆順にインデックス
[{ "fields" : ["name"]  , "sparse": True } ] #スパースインデックス

#ユニークインデックスはドキュメント定義で
class User(Document):
    name = StringField(unique=True)