PyMongo使用入门(五)

自定义类型示例

人工编码和解码:

from bson import Binary
from pymongo.mongo_client import MongoClient
from pymongo.son_manipulator import SONManipulator

client = MongoClient()
#client.drop_database("custom_type_example")
db = client.custom_type_example

"""实体类"""
class Custom(object):
   def __init__(self, x):
     self.__x = x

   def x(self):
     return self.__x
"""------------------------------------------------------------------"""
#人工编码和解码
def encode_custom(custom):
   return {"_type": "custom", "x": custom.x()}

def decode_custom(document):
   assert document["_type"] == "custom"
   return Custom(document["x"])

db.test.insert({"custom": encode_custom(Custom(5))})
print(db.test.find_one())


print(decode_custom(db.test.find_one()["custom"]))
print(decode_custom(db.test.find_one()["custom"]).x())

如图

这里写图片描述


这里写图片描述

自动编码和解码

"""自动编码和解码"""
class Transform(SONManipulator):
 def transform_incoming(self, son, collection):
   for (key, value) in son.items():
     if isinstance(value, Custom):
       son[key] = encode_custom(value)
     elif isinstance(value, dict): # Make sure we recurse into sub-docs
       son[key] = self.transform_incoming(value, collection)
   return son
 def transform_outgoing(self, son, collection):
   for (key, value) in son.items():
     if isinstance(value, dict):
       if "_type" in value and value["_type"] == "custom":
         son[key] = decode_custom(value)
       else: # Again, make sure to recurse into sub-docs
         son[key] = self.transform_outgoing(value, collection)
   return son

 #现在添加我们的操作者到数据库:
db.add_son_manipulator(Transform())

#这样做之后,我们可以无缝地保存和恢复Custom 实例
db.test.remove()
print(db.test.insert({"custom": Custom(5)}))
print(db.test.find_one())
print(db.test.find_one()["custom"].x())
"""------------------------------------------------------------------"""

如图

这里写图片描述


这里写图片描述

二进制编码

"""二进制编码"""

def to_binary(custom):
    return Binary(str(custom.x()).encode(), 128)

def from_binary(binary):
    return Custom(int(binary))

class TransformToBinary(SONManipulator):
    def transform_incoming(self, son, collection):
      for (key, value) in son.items():
        if isinstance(value, Custom):
          son[key] = to_binary(value)
        elif isinstance(value, dict):
          son[key] = self.transform_incoming(value, collection)
      return son

    def transform_outgoing(self, son, collection):
      for (key, value) in son.items():
        if isinstance(value, Binary) and value.subtype == 128:
          son[key] = from_binary(value)
        elif isinstance(value, dict):
          son[key] = self.transform_outgoing(value, collection)
      return son

#清空数据库,并添加新的操作者
"""
db.test.remove()
db.add_son_manipulator(TransformToBinary())
db.test.insert({"custom": Custom(5)})
print(db.test.find_one())
print(db.test.find_one()["custom"].x())
"""

"""我们可以看到什么是真正被保存到数据库中(并验证它使用的是二进制实例)
通过清除操作者并重复查找我们的find_one():"""
db = client.custom_type_example
print(db.test.find_one())

如图

这里写图片描述


这里写图片描述


这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值