Home > Database > Mysql Tutorial > body text

pymongo教程(3)自定义数据类型

WBOY
Release: 2016-06-07 16:34:17
Original
1550 people have browsed it

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
Copy after login

要将自定义类型的数据存入数据库中需要先进行编码;将数据从数据库读取出来后又需要再解码。

手动编码/解码

我们可以定义两个方法,在插入和查询数据时进行手动的编码、解码。

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'])
Copy after login

自动编码/解码

手动地进行编码虽然可行,但是还是不太方便。我们还可以使用 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())
Copy after login

二进制编码

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

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())
Copy after login
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template