【问题标题】:PyMongo misbehaving with floating point numbersPyMongo 对浮点数行为不端
【发布时间】:2015-09-03 16:26:50
【问题描述】:

我正在使用 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) not c.enter_data("24.3")
  • 在那种情况下,浮点数24.3如何变成字符串"-0.000063384",这极不可能不是由于某处的人为错误
  • 我正在使用两台不同的计算机,一台用于开发,另一台用于互联网,我自己编写了对象。在发帖之前我应该​​先校对一下
  • 无论如何我已经修改了这个问题,谢谢你指出这一点
  • 问题可能是缺乏浮点支持吗?

标签: python mongodb pymongo raspbian database


【解决方案1】:

基于此

c.enter_data("24.3")

post = {"auth": data, ... # 内部没有转换

你实际上是在插入一个字符串,而不是一个浮点数

您应该可以使用c.enter_data(24.3) 插入浮点数

为了进一步调试,我建议:

  • 在 mongo 命令行客户端上尝试命令,以确认浮点行为
  • 当您在 CLI 或 Python 代码中插入时,获取插入对象的 ID,以确保您正在查看正确的对象

【讨论】:

  • 我刚刚意识到这个问题有问题。在第一个代码段中,最后一行是:c.enter_data(24.3) 而不是 c.enter_data("24.3")。我在检查整数和字符串时更改了它,但在此处发布时忘记将其更改回原始形式。
  • 正如我所说,我使用过 MOngoJava 和 CLI,它们的表现非常完美。甚至 Pymongo 在使用 Ubuntu 的英特尔计算机上也表现完美,但在 Raspbian 中,行为发生了变化。这可能是因为有限的浮点支持或不推荐使用的 mongoDB 版本(最新版本的二进制文件不适用于 ARM)。无论如何,我会尝试使用 rpi2 并让您随时更新。问候
  • 显然它也不适用于 rpi2。当我将浮点数从 rpi 插入到远程数据库时,它工作得很好。当在计算机上查询对象时,它会显示为:{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 12.1 } 但从 rpi 查询时显示为:{ "_id " : ObjectId("557d828b08139add2323aeaf"), "A" : 0.04667261646131403e-60 }
【解决方案2】:

显然插入工作正常,但查询时它以错误的格式返回对象。当我将浮点数从 rpi 插入到远程数据库时,它工作得很好。当对象在计算机上被查询时,它被发布到它应该是这样显示的:

`{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 12.1 }` 

但从 rpi 查询时显示为:

{ "_id" : ObjectId("557d828b08139add2323aeaf"), "A" : 0.04667261646131403e-60 } 

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2020-01-06
    • 2021-12-05
    • 2012-09-02
    相关资源
    最近更新 更多