18

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

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

3 に答える 3

17

今のところ、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];

于 2012-02-27T10:01:24.017 に答える
9

SERVER-4362の問題は実際に解決され、$bit更新演算子を使用できるようになりました。したがって、その引数とともに、xorこれをアトミックアクションで実行できるようになりました。

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

フィールドの値が保持されている限り、0または1ビット単位の「フリップ」が発生し、現在の値が変更時の値と反対になります。

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

于 2016-04-07T01:16:11.283 に答える
3

MongoDBv4.2以降の集約パイプラインで更新を使用できます。

1) $notを使用するオプション

  • ブール値を評価し、反対のブール値を返します。つまり、trueと評価される式が渡されると、$notfalseを返します。falseと評価される式が渡されると、$nottrueを返します。
cl.update(
  {"_id": ...}, 
  [
    { "$set": { "field": { "$not": "$field" } } }
  ]
)

遊び場

の欠点は$not、次のようにfalseと評価されます:null、0、および未定義の値とその他の値はtrueです!

2) $eqを使用するオプション

  • フィールドがfalseの場合はtrueに設定し、その他の値の場合はfalseに設定します。
cl.update(
  {"_id": ...}, 
  [
    { "$set": { "field": { "$eq": [false, "$field"] } } }
  ]
)

遊び場

于 2021-04-03T15:36:42.620 に答える