2012-02-27 3 views
13

MongoDBのONEドキュメントのブール値フィールドをアトミ​​ック操作で切り替える方法はありますか?言う、(Pythonで)アトミック操作で1つのドキュメントのブール値フィールドを切り替えるにはどうすればいいですか?

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

別々のドキュメントに対する操作はアトミックですが、一連のドキュメントに対する操作はアトミックではありません。コレクションのすべての文書に対してフラグを変更する必要があることを意味しますか? – Oleg

+0

申し訳ありませんが、私はこれを明確にしませんでした。私は別々の文書の操作を希望します。 – halfjuice

答えて

15

今は、私はそれを1回の操作で行うことはできないと思います。ビットワイズ演算子(http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit)にはまだ「$ xor」はありませんが、パッチはあります。

今、私が考えるには、常に「$の株式会社」を使用していると思うの回避策:

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

代わりに、真または偽のチェックの後、あなたは項目が「真」であるかどうかを確認することが可能です。

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

IE、あなたはそれも「解除」された状態でも、または不均一なのかどうか確認するためにモジュロ演算子を使用して、凹凸は、「設定」されています。あなたはoppposite行動(すなわち、フラグが設定されていないすべての項目を見つける)を持つようにしたい場合は、

[ 2, 0 ];

+0

ニースの解決策、#mongodb;で同様に提案されている)この会話の結果としてのチケットhttps://jira.mongodb.org/browse/SERVER-4362 –

4

を使うSERVER-4362問題が実際に解決されました、あなたは利用可能$bit更新演算子を持っています。だから、一緒にあなたが今アトミックアクションでこれを行うことができますxor引数です:

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

だから、限り、フィールドの値が0または1に保たれるよう、次にビット単位の「フリップ」は、その電流値を作るなります修正の時のそれとは逆です。

.findOneAndUpdate()は必須ではなく、すべての変更で結果の値が異なることを示す方法です。

+4

整数の代わりにブール値に使用する方法はありますか? – mlovic

関連する問題