MongoDBの1つのドキュメントのブールフィールドをアトミック操作で切り替える方法はありますか?言う、(Pythonで)
cl.update({"_id": ...}, {"$toggle": {"field": 1}})
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':{'フィールド':1}});
次に、trueまたはfalseをチェックする代わりに、アイテムが「true」であるかどうかをチェックできます。
cl.find({"_id":...、'フィールド':{'$ mod':[2、1]});
IEでは、モジュロ演算子を使用して、「設定されていない」場合でも不均一である場合と「設定されている」場合でも不均一であるかどうかを確認します。反対の動作をしたい場合(つまり、フラグが設定されていないすべてのアイテムを検索する場合)、
[2、0];
SERVER-4362の問題は実際に解決され、$bit
更新演算子を使用できるようになりました。したがって、その引数とともに、xor
これをアトミックアクションで実行できるようになりました。
cl.findOneAndUpdate(
{ "_id": ...},
{
"$bit": {
"field": { "xor": NumberInt(1) }
}
},
{ "returnNewDocument": true, "upsert": true }
);
フィールドの値が保持されている限り、0
または1
ビット単位の「フリップ」が発生し、現在の値が変更時の値と反対になります。
これ.findOneAndUpdate()
は必須ではありませんが、結果の値が変更ごとに異なることを示すための方法にすぎません。
MongoDBv4.2以降の集約パイプラインで更新を使用できます。
$not
falseを返します。falseと評価される式が渡されると、$not
trueを返します。cl.update(
{"_id": ...},
[
{ "$set": { "field": { "$not": "$field" } } }
]
)
の欠点は
$not
、次のようにfalseと評価されます:null、0、および未定義の値とその他の値はtrueです!
cl.update(
{"_id": ...},
[
{ "$set": { "field": { "$eq": [false, "$field"] } } }
]
)