PyMongo SON操纵器/变换不工作(mongodb)

时间:2015-10-22 20:00:30

标签: mongodb python-2.7

我试图在保存到MongoDB之前尝试使用操纵器将十进制转换为float。数据来自SQL Server数据库,我使用pymssql导入,后者基于freeTDS。

我已按照MongoDB文档的说明操作,但我一直收到错误:

File "build\bdist.win32\egg\pymongo\collection.py", line 467, in insert_one
File "build\bdist.win32\egg\pymongo\collection.py", line 430, in _insert
bson.errors.InvalidDocument: Cannot encode object: Decimal('5019.13')

以下是我的转换代码:

import decimal
class Transform(SONManipulator):
    def transform_incoming(self, son, collection):
        for (key, value) in son.items():
            if isinstance(value, decimal.Decimal):
                son[key] = float(value)
            elif isinstance(value, dict):
                son[key] = self.transform_incoming(value, collection)
        return son

我把它添加到db:

def get(collection):
    client = MongoClient(uri)
    db = client[database]
    db.add_son_manipulator(Transform())
    return db[collection]

当我打电话

collection = get('mycollection')
collection.insert_one(object)

1 个答案:

答案 0 :(得分:8)

根据MongoDB Changelog,自MongoDB 3.0起,SONManipulator API已弃用,不适用于db.insert_one()

  

SONManipulator API作为一种转换技术存在局限性   你的数据。相反,它更灵活,更直接   在传递文档之前,在您自己的代码中转换传出文档   PyMongo,收到后转换传入的文件   PyMongo。

     

因此不推荐使用add_son_manipulator()方法。 PyMongo 3的新功能   CRUD API不会将SON操纵器应用于传递给的文档   bulk_write(),insert_one(),insert_many(),update_one()或   update_many()。 SON操纵器不适用于返回的文档   通过新方法find_one_and_delete(),find_one_and_replace()和   find_one_and_update()

然而,它可以在db.insert()上运行,但它也被弃用了。

因此,最好在应用代码和数据库之间的边界上编写自定义转换器。