Как переключить логическое поле в одном документе с помощью атомарной операции?
-
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()
не является обязательным, а является лишь способом продемонстрировать, что результирующее значение отличается при каждой модификации.