アトミックな操作で 1 つのドキュメント内のブール型フィールドを切り替えるにはどうすればよいですか?
-
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()
は必須ではありませんが、結果の値が変更ごとに異なることを示すための単なる方法です。
所属していません StackOverflow