通过pymongo更新MongoDB记录导致大部分被删除

2 投票
1 回答
750 浏览
提问于 2025-04-16 23:43

我正在用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以上的版本有没有已知的问题?还有可能是什么其他原因导致的?我有什么办法可以查明到底发生了什么吗?

1 个回答

0

这可能还有其他原因吗?我有什么方法可以找出到底发生了什么?

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

coll.update() 这个操作中,你没有设置 safe 这个变量。如果在 update 过程中出现了异常,它不会被抛出来。

在你的代码里,你没有捕捉异常(这是建议的做法),而且你的更新操作也没有检查异常,所以你根本不知道发生了什么。

第二个要检查的是 “你是怎么计数的?”

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

你有原始数据的备份吗?能不能在这10个或100个数据中选几个小的来运行你的代码,看看发生了什么?

你描述的情况在任何MongoDB驱动中都不正常。我们确实需要更多的信息来解决这个问题。

撰写回答