2012-02-27 2 views
13

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

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

Операции над отдельным документом являются атомарными, но операции с множеством документов не являются атомарными. Вы имеете в виду, что вам нужно изменить флаг для всех документов коллекции? – Oleg

+0

Извините, я не прояснил это. Я бы хотел, чтобы операции на отдельном документе. – halfjuice

ответ

15

Прямо сейчас, я не думаю, что это возможно сделать с одной операцией. Побитовые операторы (http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit) не имеют «$ xor», хотя у меня есть патч для него.

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

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

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

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

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

[ 2, 0 ];

+0

Хорошее решение, предложенное аналогичным в #mongodb;) Билет в результате этой беседы здесь https://jira.mongodb.org/browse/SERVER-4362 –

4

Вопрос SERVER-4362 фактически решен сейчас и у вас есть оператор $bit обновления. Так наряду с его xor аргумента теперь вы можете сделать это в атомных действиях:

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

Так до тех пор, пока значение поля хранятся в 0 или 1 то побитовый «флип» приведет, что делает текущее значение напротив того, что было во время модификации.

.findOneAndUpdate() не требуется, а всего лишь способ продемонстрировать, что результирующее значение отличается от каждой модификации.

+4

Есть ли способ использовать это для логических значений вместо целых чисел? – mlovic