如何切换与原子操作一个文档中的布尔字段?如何切换与原子操作一个文档中的布尔字段?(How to to

2019-05-12 07:39发布

有没有办法用原子操作切换MongoDB中一个文档的布尔领域? 说,(在Python中)

cl.update({"_id": ...}, {"$toggle": {"field": 1}})

Answer 1:

现在,我不认为这是可能的一个操作来做到这一点。 位运算符(http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit)没有“$ XOR”但尽管我一个补丁吧。

现在的解决办法,我认为想的是总是用“$ INC”:

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

然后,而不是检查真的还是假的,你可以做什么检查项目是否是“真”:

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

IE浏览器,您可以使用模运算符,看看它是否是均匀或不均匀甚至是“未设置”,和正在不均“设置”。 如果你想拥有oppposite行为(即,发现没有标志设置的所有项目),然后使用

  [2,0]; 



Answer 2:

该SERVER-4362的问题,现在实际上解决,你有$bit更新运营商提供。 因此,伴随着它的xor参数,你现在可以在一个原子操作做到这一点:

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

所以只要字段的值保持在01 ,然后按位“翻转”将导致,使电流值的它是在变形例的时间相反。

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



文章来源: How to toggle a boolean field in one document with atomic operation?