アトミックな操作で 1 つのドキュメント内のブール型フィールドを切り替えるにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/9459789

  •  13-11-2019
  •  | 
  •  

質問

MongoDB の 1 つのドキュメントのブールフィールドをアトミ​​ック操作で切り替える方法はありますか?言ってください (Python で)

cl.update({"_id": ...}, {"$toggle": {"field": 1}})
役に立ちましたか?

解決

今、私はそれが1つの操作でこれをすることが可能であるとは思わない。ビット単位演算子(http://www.mongodb.org/display/docs/updating#updating-%24bit)はまだ「$ XOR」を持っていません。

今対処方法私は常に '$ inc'を使用していることであると思う:

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

TRUEまたはFALSEをチェックする代わりに、項目が「真」かどうかを確認できます。

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

IE、Modulo演算子を使用して、偶数でも不均一か、「設定解除」でも不均一であるか、「設定」が「設定」されているかを確認します。opppositeの動作をしたい場合(つまり、フラグが設定されていないすべての項目を検索)、

[ 2, 0 ];

を使用してください。

他のヒント

サーバー-4362 現在、問題は実際に解決されており、 $bit 更新オペレーターが利用可能です。それでそれと一緒に xor 引数をアトミック アクションで実行できるようになりました。

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

したがって、フィールドの値が維持される限り、 0 または 1 その後、ビットごとの「反転」が行われ、現在の値が変更時の値とは逆になります。

.findOneAndUpdate() は必須ではありませんが、結果の値が変更ごとに異なることを示すための単なる方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top