Python 条件原子mongo-remove具有不同的结果
mongo数据库中有一个项目集合。我想实现一个方法,删除一个项目,只要它的Python 条件原子mongo-remove具有不同的结果,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,mongo数据库中有一个项目集合。我想实现一个方法,删除一个项目,只要它的id 但是,我只想在项目的deletable属性设置为true时删除该项目。然后,我想区分以下情况(错误)以进行不同的处理: 该项存在并且deletable属性设置为true=>将其删除 该项存在,并且deletable属性设置为false=>不删除它,raiseerror1 项目不存在=>无需删除,引发错误2 假设应用程序是多线程的,并且可能有几个工作人员添加、删除和修改项,有没有方法正确处理这种情况 就目前而言,我
id
但是,我只想在项目的deletable
属性设置为true
时删除该项目。然后,我想区分以下情况(错误)以进行不同的处理:
- 该项存在并且
属性设置为deletable
=>将其删除true
- 该项存在,并且
属性设置为deletable
=>不删除它,false
raiseerror1
- 项目不存在=>无需删除,
引发错误2
id
和deletable
属性的项,或者逐个发出一些查询来处理所有情况,但这可能不是线程安全的
我正在使用
pymongo
来访问数据库,如果这很重要的话。您永远不会在一条语句中看到这一点,因为“有多少”字段与您的条件匹配是没有区别的。但是,您可以使用逻辑条件和一个额外的查找来执行此操作,第一次尝试没有删除任何文档。只需使用write-concern响应来查看发生了什么
resp=db.collection.remove({'id':id,'deletable':True},w=1)
如果resp['n']==0:
doc=db.collection.find_one({'id':id,'deletable':False})
如果doc为None:
#这将找不到404
其他:
#这将是不可删除的
其他:
#这将被删除200
因此,使用应用的任何写入问题检查返回值,让您知道是否发生了删除,下面的
find_one
让您知道文档当时是否未找到或只是标记为deletablefalse
。为什么需要区分?如果您真的这么认为,那么尝试查询现有的“id”来决定返回哪个错误有什么错呢?我确实需要区分以正确生成HTTP响应状态代码:200、404和400。没有真正理解你所说的“只是试图查询现有的‘id’”的意思。我理解你的方法。我只是担心你把if
s和else
es搞砸了<代码>如果resp['n']==0:这意味着没有删除任何内容,对吗?所以我想返回404,而不是200在这种情况下。好的,谢谢。我不能称之为原子操作,但在多线程环境中,这看起来正如我所希望的那样工作。@Ixanezis这基本上就是我在开始时所说的。MongoDB不区分“为什么”不匹配的内容。它要么有,要么没有。因此,如果你需要区分,那么你需要测试这个条件。这不可能是一个单一的声明。是的,我明白了。顺便说一句,我正试图删除你的
和圆括号看起来更像pep8,但这只是一个4个字符的编辑%|。