Как переключить логическое поле в элементе 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}});
Другие вопросы по тегам