我试图在保存到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)
答案 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()
上运行,但它也被弃用了。
因此,最好在应用代码和数据库之间的边界上编写自定义转换器。