Как переключить логическое поле в элементе Array в MongoDB?
Рассмотрим эти данные
{
"_id" : ...,
"array" : [
{ "name" : "value1","flag" : true } ,
{ "name" : "value2","flag" : false }
]
}
Я хотел бы переключить 2-й элемент массива (от ложного до истинного)
Я знаю, что могу обновить определенный элемент, используя очень полезный оператор $ positional, например так:
db.myCollection.update(
{'array.name':'value2'},
{
$set: {
'array.$.flag':true
}
},false,true);
Но есть ли способ использовать оператор $ positional также для установки значения?
например, как это?
db.myCollection.update(
{'array.name':'value2'},
{
$set: {
'array.$.flag':'!array.$.flag' //<--
}
},false,true);
1 ответ
Решение
Нет, в данный момент это невозможно. MongoDB не допускает выражения в обновлениях, которые зависят от полей в документе. Вам придется получить и установить в двух отдельных операциях.
Однако есть хитрость, чтобы сделать это за одну операцию (и, следовательно, атомарную). Вместо логического значения есть целое число. Тогда даже значения будут представлять false
нечетные - true
,
// get documents with false flag
db.collection.find({flag: {$mod: [2, 0]}})
// get documents with true flag
db.collection.find({flag: {$mod: [2, 1]}})
// toggle flag
db.collection.update(query, {$inc: {flag: 1}});