视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
pymongo教程(3)自定义数据类型
2020-11-09 13:14:41 责编:小采
文档

pymongo提供一些常用的数据类型,如:数据、字符串、日期等。如果感觉还不能满足需求,那么还可以自定义数据类型。 首先定义一个类: class Custom(object): def __init__(self, x): self.__x = x def x(self): return self.__x 要将自定义类型的数据存入数

pymongo提供一些常用的数据类型,如:数据、字符串、日期等。如果感觉还不能满足需求,那么还可以自定义数据类型。

首先定义一个类:

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"])
print(db.test.insert({"custom": encode_custom(Custom(5))}))
print(db.test.find_one()['custom'])

自动编码/解码

手动地进行编码虽然可行,但是还是不太方便。我们还可以使用 SONManipulator 进行自动编码。

from pymongo.son_manipulator import SONManipulator
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())
print(db.test.insert({"custom": Custom(5)}))
print(db.test.find_one())

二进制编码

我们也可以将其编码成二进制进行存储。

from bson.binary import Binary
def to_binary(custom):
 return Binary(str(custom.x()), 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.add_son_manipulator(TransformToBinary())
print(db.test.insert({"custom": Custom(5)}))
print(db.test.find_one())
下载本文
显示全文
专题