PyMongo 对浮点数的错误处理
PyMongo misbehaving with floating point numbers
我正在使用 PyMongo 将数据保存到 MongoDB。以下是我的代码:
from pymongo import MongoClient
import time
class data2db:
def __init__(self):
pass
def enter_data(self, data):
client = MongoClient('127.0.0.1', 27017)
db = client.db
coll = db.Temperature1
post = {"auth": data,
"Time": time.asctime(time.localtime(time.time()))}
post_ = coll.insert(post)
c = data2db()
c.enter_data(24.3)
但是,当我检索此对象时,我得到:
{ "_id" : ObjectId("558019749f43b8c19779c106"), "auth" : -0.000063384, "Time" : "Tue Jun 16 08:41:24 2015" }
当我用整数尝试相同的代码时,它工作正常。我在 RaspberryPi 上使用 MongoDB 2.6.3,最新版本为 Raspbian 和 python 2.7.3。我通过以下命令从 Raspbian 存储库安装了 Pymongo:
sudo apt-get install python-pymongo
有人可以帮我吗?
更新:
相同的代码在使用 Ubuntu 14.04 LTS、mongoDB 3.0.1、python 2.7.3 和 pyMongo 2.8 的英特尔计算机上表现完美,但是当涉及到 Raspbian 时行为改变。即使在 mongo shell 中,Raspbian 上的浮点插入也是错误的。这可能是因为有限的浮点支持或已弃用的 mongoDB 版本(最新版本的二进制文件不适用于 ARM)。无论如何,我会在今天晚些时候使用 rpi2 进行尝试,并检查它是否有所作为。
基于此
c.enter_data("24.3")
post = {"auth": data, ... # No conversion done internally
你实际上是在插入一个字符串,而不是一个浮点数
您应该可以使用 c.enter_data(24.3)
插入浮点数
为了进一步调试,我建议:
- 尝试 mongo 命令行客户端上的命令,以确认浮点行为
- 当您在 CLI 或您的 Python 代码中插入时,获取插入对象的 ID,以确保您正在寻找正确的对象
显然插入工作正常,但在查询时 returns 对象格式错误。当我将一个浮点数从 rpi 插入到远程数据库时,它工作得很好。当在计算机上查询该对象时,它会按应有的方式显示:
`{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 12.1 }`
但是当从 rpi 查询时它显示为:
{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 0.04667261646131403e-60 }
我正在使用 PyMongo 将数据保存到 MongoDB。以下是我的代码:
from pymongo import MongoClient
import time
class data2db:
def __init__(self):
pass
def enter_data(self, data):
client = MongoClient('127.0.0.1', 27017)
db = client.db
coll = db.Temperature1
post = {"auth": data,
"Time": time.asctime(time.localtime(time.time()))}
post_ = coll.insert(post)
c = data2db()
c.enter_data(24.3)
但是,当我检索此对象时,我得到:
{ "_id" : ObjectId("558019749f43b8c19779c106"), "auth" : -0.000063384, "Time" : "Tue Jun 16 08:41:24 2015" }
当我用整数尝试相同的代码时,它工作正常。我在 RaspberryPi 上使用 MongoDB 2.6.3,最新版本为 Raspbian 和 python 2.7.3。我通过以下命令从 Raspbian 存储库安装了 Pymongo:
sudo apt-get install python-pymongo
有人可以帮我吗?
更新: 相同的代码在使用 Ubuntu 14.04 LTS、mongoDB 3.0.1、python 2.7.3 和 pyMongo 2.8 的英特尔计算机上表现完美,但是当涉及到 Raspbian 时行为改变。即使在 mongo shell 中,Raspbian 上的浮点插入也是错误的。这可能是因为有限的浮点支持或已弃用的 mongoDB 版本(最新版本的二进制文件不适用于 ARM)。无论如何,我会在今天晚些时候使用 rpi2 进行尝试,并检查它是否有所作为。
基于此
c.enter_data("24.3")
post = {"auth": data, ... # No conversion done internally
你实际上是在插入一个字符串,而不是一个浮点数
您应该可以使用 c.enter_data(24.3)
为了进一步调试,我建议:
- 尝试 mongo 命令行客户端上的命令,以确认浮点行为
- 当您在 CLI 或您的 Python 代码中插入时,获取插入对象的 ID,以确保您正在寻找正确的对象
显然插入工作正常,但在查询时 returns 对象格式错误。当我将一个浮点数从 rpi 插入到远程数据库时,它工作得很好。当在计算机上查询该对象时,它会按应有的方式显示:
`{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 12.1 }`
但是当从 rpi 查询时它显示为:
{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 0.04667261646131403e-60 }