標籤:
from pymongo.mongo_client import MongoClientclient=MongoClient(‘192.168.30.252‘,27017)client=drop_database(‘custom_type_example‘)db=client.custom_type_exampleclass Custom(object):def __init__(self,x):self.__x=xdef x(self):return self.__x###上面的類 不能自動編碼 需要手動編碼 如下#將custom編碼成json格式def encode_custom(custom):return {"_type": "custom", "x": custom.x()}#將document還原成custom類def decode_custom(document):assert document["_type"] == "custom"return Custom(document["x"])db.test.insert({"custom": encode_custom(Custom(5))})db.test.find_one()decode_custom(db.test.find_one()["custom"])decode_custom(db.test.find_one()["custom"]).x()foo=Custom(10)foo.x()#手動顯得繁瑣,使用自動的吧from pymongo.son_manipulator import SONManipulatorclass 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 sondef 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())#插入物件類型db.test.insert({"custom": Custom(5)})db.test.find_one()#使用物件類型db.test.find_one()["custom"].x()5def to_binary(custom):return Binary(str(custom.x()), 128)def from_binary(binary):return Custom(int(binary))#二進位編碼from bson.binary import Binaryfrom pymongo.son_manipulator import SONManipulatorclass 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 sondef 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.add_son_manipulator(TransformToBinary())
python操作mongodb之六自訂類型儲存