Как переключить логическое поле в одном документе с помощью атомарной операции?

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

  •  13-11-2019
  •  | 
  •  

Вопрос

Есть ли способ переключить логическое поле ОДНОГО документа в MongoDB с помощью атомарной операции?Скажем (на питоне)

cl.update({"_id": ...}, {"$toggle": {"field": 1}})
Это было полезно?

Решение

прямо сейчас, я не думаю, что можно сделать это одним операцией.Побитовые операторы (http://www.mongodb.org/display/docs/updating#updating-%24bit) У вас еще нет '$ XOR', хотя у меня есть патч для него.

прямо сейчас обходной путь, я думаю, что думать о том, что всегда используя '$ inc':

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

Тогда вместо проверки истинного или ложного, вы можете проверить, будет ли элемент «TRUE»:

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

IE, вы используете оператор модуля, чтобы увидеть, даже неравномерно неравномерно неравномерно, будучи «unset», а неравномерный «набор».Если вы хотите иметь поведение против оппозита (т. Е. Найти все элементы, которые не имеют набора флага), затем используйте

[ 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