Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 条件原子mongo-remove具有不同的结果_Python_Mongodb_Mongodb Query_Pymongo - Fatal编程技术网

Python 条件原子mongo-remove具有不同的结果

Python 条件原子mongo-remove具有不同的结果,python,mongodb,mongodb-query,pymongo,Python,Mongodb,Mongodb Query,Pymongo,mongo数据库中有一个项目集合。我想实现一个方法,删除一个项目,只要它的id 但是,我只想在项目的deletable属性设置为true时删除该项目。然后,我想区分以下情况(错误)以进行不同的处理: 该项存在并且deletable属性设置为true=>将其删除 该项存在,并且deletable属性设置为false=>不删除它,raiseerror1 项目不存在=>无需删除,引发错误2 假设应用程序是多线程的,并且可能有几个工作人员添加、删除和修改项,有没有方法正确处理这种情况 就目前而言,我

mongo数据库中有一个项目集合。我想实现一个方法,删除一个项目,只要它的
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
让您知道文档当时是否未找到或只是标记为deletable
false

为什么需要区分?如果您真的这么认为,那么尝试查询现有的“id”来决定返回哪个错误有什么错呢?我确实需要区分以正确生成HTTP响应状态代码:200、404和400。没有真正理解你所说的“只是试图查询现有的‘id’”的意思。我理解你的方法。我只是担心你把
if
s和
else
es搞砸了<代码>如果resp['n']==0:这意味着没有删除任何内容,对吗?所以我想返回404,而不是200在这种情况下。好的,谢谢。我不能称之为原子操作,但在多线程环境中,这看起来正如我所希望的那样工作。@Ixanezis这基本上就是我在开始时所说的。MongoDB不区分“为什么”不匹配的内容。它要么有,要么没有。因此,如果你需要区分,那么你需要测试这个条件。这不可能是一个单一的声明。是的,我明白了。顺便说一句,我正试图删除你的
和圆括号看起来更像pep8,但这只是一个4个字符的编辑%|。