如何使用原子操作在一个文档中切换布尔字段?

hal*_*ice 15 mongodb mongodb-query

有没有办法用MongoDB在原子操作中切换ONE文档的布尔字段?说,(在python中)

cl.update({"_id": ...}, {"$toggle": {"field": 1}})
Run Code Online (Sandbox Code Playgroud)

Der*_*ick 16

现在,我不认为通过一次操作可以做到这一点.位运算符(http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit)没有'$ xor',尽管我有一个补丁.

现在我想到的解决方法是始终使用'$ inc':

cl.update( { "_id": ...}, { '$inc' : { 'field' : 1 } } );

然后,您可以检查项目是否为"true",而不是检查true或false.

cl.find( { "_id": ..., 'field' : { '$mod' : [ 2, 1 ] } );

IE,你使用模运算符来查看它是偶数还是不均匀,即使是"未设置",也不均衡是"设置".如果你想拥有相反的行为(即找到没有设置标志的所有项目),那么使用

[ 2, 0 ];


Nei*_*unn 6

SERVER-4362的问题,现在实际上解决,你有$bit更新可用的操作。因此,连同其xor参数一起,您现在可以在原子操作中执行此操作:

cl.findOneAndUpdate( 
  { "_id": ...}, 
  { 
     "$bit": { 
         "field": { "xor": NumberInt(1) } 
     } 
  },
  { "returnNewDocument": true, "upsert": true }
);
Run Code Online (Sandbox Code Playgroud)

因此,只要将field的值保持在01随后按位进行“翻转”,就会使当前值与修改时的值相反。

.findOneAndUpdate()不是必需的,而只是一个证明所得到的值是在每次修改不同的方式。

  • 有什么方法可以将其用于布尔值而不是整数? (6认同)