【问题标题】:Updating records in MongoDB through pymongo leads to deletion of most of them通过 pymongo 更新 MongoDB 中的记录会导致大部分记录被删除
【发布时间】:2011-10-28 08:06:32
【问题描述】:

我在我的 python 代码中使用远程 mongodb 数据库。访问数据库的代码和数据库本身位于两台不同的机器上。我使用的 pymongo 模块版本是 1.9+。 该脚本由以下代码组成:

 for s in coll.find({ "somefield.a_date" : { "$exists":False },
                               "somefield.b_date" : { "$exists":False }}):
            original = s['details']['c_date']

            utc = from_tz.localize(original).astimezone(pytz.utc)

            s['details']['c_date'] = utc

            if str(type(s['somefield'])) != "<type 'dict'>":
                     s['somefield'] = {}

            s['somefield']['b_date'] = datetime.utcnow()

            coll.update({ '_id' : s['_id'] }, s );

运行这段代码后,发生了一件奇怪的事情。最初的集合中有数百万条记录,运行脚本后,只剩下总记录的 29%,其余的被自动删除。 PyMongo 驱动程序版本 1.9+ 是否存在任何已知问题? 这可能是什么其他原因以及我可以找出到底发生了什么的任何方法?

【问题讨论】:

  • 你应该使用if isinstance(s['somefield'], dict):而不是if str(type(s['somefield'])) != "&lt;type 'dict'&gt;":——它更具可读性和pythonic

标签: python mongodb pymongo


【解决方案1】:

这可能是什么其他原因以及我可以通过什么方式找出到底发生了什么?

首先要检查的是“有没有异常”

coll.update() 中,您没有设置safe 变量。如果update有异常,不会抛出。

在您的代码中,您不会捕获异常(建议这样做),并且您的更新不会检查异常,因此您无法知道发生了什么。

要检查的第二件事是“你是怎么数的”

update 命令可以“清空”数据,但不能删除数据(或更改_id)。

您有原始数据的副本吗?你能在这 10 个或 100 个中的一小部分上运行你的代码,看看发生了什么吗?

您所描述的任何 MongoDB 驱动程序都不正常。我们肯定需要更多数据来解决这个问题。

【讨论】:

  • 感谢您的回复。让我尝试在一组较小的数据上运行代码,然后得到结果。另外,正如你建议的那样,这次我使用安全变量并向代码添加异常处理。
  • 我正在使用 db.collection_name.count() 计算记录。这不是计算数据的正确方法吗?另外,更新消隐数据但不删除数据是什么意思?
  • 格式不正确的update 可能会导致文档中出现错误数据。但是_id 无法更改,因此格式错误的更新无法“删除”文档。测试如何进行?您是否有定期删除数据的测试用例?
  • 是的db.collection_name.count() 是计算数据的正确方法。但是,如果您使用分片,则必须从 mongos 发出该调用,因此请务必仔细检查您是否连接到正确的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多