我在玩新的mongodb数据类型NumberDecimal
。我通常会构建要求精确度(或尽可能精确度)的科学应用程序,因此我想知道如何使用它。
我正在构建的应用程序之一是python flask应用程序,该应用程序从数据库中提取数据并执行各种计算。但是,当我从mongodb中拉一个NumberDecimal
(假设NumberDecimal('24.55')
)并尝试将其添加到在python中创建的bson.decimal128.Decimal128
数字中时,出现以下错误:
TypeError: unsupported operand type(s) for +: 'Decimal128' and 'Decimal128'
如果我尝试将
NumberDecimal
转换为decimal.Decimal
(或其他任何方式):TypeError: Cannot convert Decimal128('24.55') to Decimal
所以我想我有几个问题:(1)是否可以将
NumberDecimal
转换为我可以在python中使用的任何东西,(2)如果没有,是否可以将所有其他数字转换为兼容的数据类型在NumberDecimal
中,(3)如果没有,在我看来,我可以使用的唯一方法是在服务器端使用聚合框架(还有其他用例)吗? 最佳答案
似乎您需要将Decimal128实例转换为标准的Python小数,才能对其进行操作。但是您应该在create_decimal128_context
从bson.decimal128
创建的上下文中执行此操作,以确保以后可以将结果存储在数据库中。
>>> from bson.decimal128 import Decimal128, create_decimal128_context
>>> import decimal
>>>
>>> D128_CTX = create_decimal128_context()
>>>
>>> with decimal.localcontext(D128_CTX):
... d1 = Decimal128('1.23')
... d2 = Decimal128('3.21')
... d3 = Decimal128(d1.to_decimal() + d2.to_decimal())
...
>>> print(d3, type(d3))
4.44 <class 'bson.decimal128.Decimal128'>
>>> print(d3.to_decimal(), type(d3.to_decimal()))
4.44 <class 'decimal.Decimal'>
>>> decimal.Decimal(d3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: conversion from Decimal128 to Decimal is not supported
并且,如您从上面的最后两个命令所看到的,要转换为Python的Decimal类型,请使用Decimal128.to_decimal方法。不要尝试在Decimal构造函数中传递Decimal128实例。
在Python 3.6和pymongo 3.4上测试。
受到
bson.decimal128
模块的pymongo的documentation的启发。关于python - MongoDB NumberDecimal:+不支持的操作数类型:'Decimal128'和'Decimal128',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41308044/