FrontPage

python用のMongoDBライブラリ。

official website: http://mongoengine.org/

できること

  • DocumentオブジェクトによるORM的なアクセス(ODM)
  • Documentオブジェクトによる型バリデーション
  • EmbeddedObject?のサポート
  • ReplicaSet?のサポート

ワーキングサンプル

ドキュメントの定義

プロパティ値の必須有無もrequired引数で定義可能。

import datetime
from mongoengine import *

class Feed(Document):
    user_id = IntField(required=True)
    subscriber = ListField()
    message = StringField()
    created_at = DateTimeField(default=datetime.datetime.utcnow)
    updated_at = DateTimeField(default=datetime.datetime.utcnow)

    meta = {
        'allow_inheritance': True, # 継承可能
        'shard_key': ('user_id', 'created_at'), # シャードキーの設定(どう作用するか未確認)
        'indexes': [ # インデックス定義
            'user_id',
            'subscriber',
            'updated_at',
        ]
    }

unique制約も付けられる。フィールドの定義にuniqueを渡す。

class ArticleModelExtender(Document):
    model_id = IntField(required=True, unique=True)

オブジェクトの作成

feed = Feed(user_id=123, subscriber=[111, 222, 333], message=u"これはフィードです")
feed.save()

オブジェクトの検索

複数取ってくる。

feeds = Feed.objects(user_id=123)

一つ取ってくる。

feed = Feed.objects.get(id='4f9ba37a3dd6070b2e000099')

RAWクエリ

MyDoc.objects(__raw__={"created_at__gte": datetime.datetime.now()})

RAWクエリと引数の混在

RAWクエリと引数によるクエリは混在できる。

MyDoc.objects(
    __raw__={"created_at__gte": datetime.datetime.now()},
    user_id=1
)

生のCollectionオブジェクトを取得する

class MyDoc(Document):
    pass

doc = MyDoc.objects()[0]
doc_dict = doc.to_mongo()

col = MyDoc._get_collection()
col.update({'_id': doc_dict['_id']}, doc_dict)

試行錯誤

特定の属性をシリアライズして保存

pickle使う。

class LocationDoc(Document):
    location = ListField(ListField(default=[None, None])) # longitude, latitude
    _location = StringField()

    def __setattr__(self, key, value):
        object.__setattr__(self, key, value)
        if key == 'location': # location属性はシリアライズして_locationにも保存
            object.__setattr__(self, '_location', pickle.dumps(value))

    def __getattribute__(self, item):
        if item == 'location': # location属性は_locationをunpickleして返す
            string = object.__getattribute__(self, '_location')
            try:
                return pickle.loads(str(string))
            except (TypeError, IndexError):
                return None
            except:
                raise

        return object.__getattribute__(self, item)
    def to_mongo(self):
       # set None value before saving to mongodb
       mongodata = super(RouteDocument, self).to_mongo()
       mongodata['location'] = None
       return mongodata
  • location属性を残しているのはDocumentクラスのバリデータを効かせたいから

to_mongo()の使われ方

save()時にto_mongo()を通してdictに変換される。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-06-22 (金) 17:54:41 (1919d)