Есть ли способ переключить булево поле ОДНОГО документа в MongoDB с атомной операцией? Скажем, (in python)Как переключить булевское поле в одном документе с атомной операцией?
cl.update({"_id": ...}, {"$toggle": {"field": 1}})
Есть ли способ переключить булево поле ОДНОГО документа в MongoDB с атомной операцией? Скажем, (in python)Как переключить булевское поле в одном документе с атомной операцией?
cl.update({"_id": ...}, {"$toggle": {"field": 1}})
Прямо сейчас, я не думаю, что это возможно сделать с одной операцией. Побитовые операторы (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 ];
Хорошее решение, предложенное аналогичным в #mongodb;) Билет в результате этой беседы здесь https://jira.mongodb.org/browse/SERVER-4362 –
Вопрос SERVER-4362 фактически решен сейчас и у вас есть оператор $bit
обновления. Так наряду с его xor
аргумента теперь вы можете сделать это в атомных действиях:
cl.findOneAndUpdate(
{ "_id": ...},
{
"$bit": {
"field": { "xor": NumberInt(1) }
}
},
{ "returnNewDocument": true, "upsert": true }
);
Так до тех пор, пока значение поля хранятся в 0
или 1
то побитовый «флип» приведет, что делает текущее значение напротив того, что было во время модификации.
.findOneAndUpdate()
не требуется, а всего лишь способ продемонстрировать, что результирующее значение отличается от каждой модификации.
Есть ли способ использовать это для логических значений вместо целых чисел? – mlovic
Операции над отдельным документом являются атомарными, но операции с множеством документов не являются атомарными. Вы имеете в виду, что вам нужно изменить флаг для всех документов коллекции? – Oleg
Извините, я не прояснил это. Я бы хотел, чтобы операции на отдельном документе. – halfjuice