Guest User

Untitled

a guest
Jan 21st, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.37 KB | None | 0 0
  1. #coding: utf8
  2.  
  3. """pymongoのAutoReferenceにパッチ当てるやつ
  4.  
  5. リスト内のDBRef全部にクエリを発行せずに{$in: [1,2,...,n]}する。
  6.  
  7. Example:
  8. >>> from pymongo.son_manipulator import AutoReference, NamespaceInjector
  9. >>> import autoreference_dbref_patch
  10. """
  11.  
  12. from bson.dbref import DBRef
  13. from bson.son import SON
  14. from pymongo.son_manipulator import AutoReference
  15.  
  16.  
  17. def transform_outgoing(self, son, collection):
  18. """Replace DBRefs with embedded documents.
  19. """
  20.  
  21. def transform_value(value):
  22. if isinstance(value, DBRef):
  23. return self._AutoReference__database.dereference(value)
  24. elif isinstance(value, list):
  25. #listの先頭がDBRefだったら1クエリで取ってくるようにする
  26. if value and isinstance(value[0], DBRef):
  27. return [o for o in self._AutoReference__database[value[0].collection].find({"_id": {"$in": [v.id for v in value]}})]
  28. else:
  29. return [transform_value(v) for v in value]
  30. elif isinstance(value, dict):
  31. return transform_dict(SON(value))
  32. return value
  33.  
  34. def transform_dict(object):
  35. for (key, value) in object.items():
  36. object[key] = transform_value(value)
  37. return object
  38.  
  39. return transform_dict(SON(son))
  40.  
  41.  
  42. #AutoReferenceにmonkey patch
  43. setattr(AutoReference, 'transform_outgoing', transform_outgoing)
Add Comment
Please, Sign In to add comment