Python 如果在更新两个键中,函数find_和_modify能否运行一半?

Python 如果在更新两个键中,函数find_和_modify能否运行一半?,python,mongodb,pymongo,Python,Mongodb,Pymongo,这里使用了pymongoPython: Dict update包含两个键: collection.find_and_modify( query={"_id": self.id}, update={ "$set": {"zzz.cur": xxx.chg}, "$unset": {"zzz.bld": xxx.chg} } ) 是否有可能只执行$set错误? 而另一个未设置的美元将失败 或者find_和_modify始终保证两个键都执行?

这里使用了pymongoPython:

Dict update包含两个键:

collection.find_and_modify(
    query={"_id": self.id},
    update={
        "$set": {"zzz.cur": xxx.chg},
        "$unset": {"zzz.bld": xxx.chg}
    }
)
是否有可能只执行$set错误? 而另一个未设置的美元将失败

或者find_和_modify始终保证两个键都执行? 我在找一只虫子。有时在我的数据库中保留的是zzz.bld。 但我不明白为什么。所以我决定澄清一下

现在看来,这个函数有时会失败,并且只运行$setmy假设。

find\u和\u modify应该是原子函数,因为它是原子函数。从:

修改单个文档时,FindModify和 update方法以原子方式更新文档

但是,我没有看到任何文档明确说明在发生错误时写入是否是原子的


但是,好消息是,如果您知道这样一个错误是如何发生的,那么使用多线程程序创建一个测试数据库是非常容易的,该程序用这样的请求轰炸数据库,然后简单地看看它是否真的是原子的。

>如果你知道这样的错误是如何发生的,事实是我不知道如何重现这种情况。所以我决定澄清一下,当我使用gevent进行测试时,find_和_modify中是否存在问题。今天这个错误重复了3次。但我从来都不明白到底是怎么回事,为什么。@Budulianin:嗯,我明白了。我也不知道更新会中途失败,但我已经有一段时间没有使用MongoDB了,所以我对实现细节的细节不是很在行。所有更新要么全是,要么全是,所以不可能让一半的更新都成功。find_和modify在这里不相关-原子性适用于所有文档写入。@Asya Kamsky:我只是想知道,如果在find_和modify中仅执行$setin,是否会出现这种情况?您不应该使用findAndModify-只需使用定期更新。更新将始终为全部或无-要么两个子字段都将更新,要么两个子字段都不更新。