Created
September 25, 2011 05:05
-
-
Save ukyo/1240260 to your computer and use it in GitHub Desktop.
pymongo AutoReference DBRef patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding: utf8 | |
"""pymongoのAutoReferenceにパッチ当てるやつ | |
リスト内のDBRef全部にクエリを発行せずに{$in: [1,2,...,n]}する。 | |
Example: | |
>>> from pymongo.son_manipulator import AutoReference, NamespaceInjector | |
>>> import autoreference_dbref_patch | |
""" | |
from bson.dbref import DBRef | |
from bson.son import SON | |
from pymongo.son_manipulator import AutoReference | |
def transform_outgoing(self, son, collection): | |
"""Replace DBRefs with embedded documents. | |
""" | |
def transform_value(value): | |
if isinstance(value, DBRef): | |
return self._AutoReference__database.dereference(value) | |
elif isinstance(value, list): | |
#listの先頭がDBRefだったら1クエリで取ってくるようにする | |
if value and isinstance(value[0], DBRef): | |
return [o for o in self._AutoReference__database[value[0].collection].find({"_id": {"$in": [v.id for v in value]}})] | |
else: | |
return [transform_value(v) for v in value] | |
elif isinstance(value, dict): | |
return transform_dict(SON(value)) | |
return value | |
def transform_dict(object): | |
for (key, value) in object.items(): | |
object[key] = transform_value(value) | |
return object | |
return transform_dict(SON(son)) | |
#AutoReferenceにmonkey patch | |
setattr(AutoReference, 'transform_outgoing', transform_outgoing) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment