如何在MongoDB中切换数组元素中的布尔字段?

如何在MongoDB中切换数组元素中的布尔字段?,mongodb,positional-operator,Mongodb,Positional Operator,以这些数据为例 { "_id" : ..., "array" : [ { "name" : "value1","flag" : true } , { "name" : "value2","flag" : false } ] } 我想切换第二个数组元素(从false到true) 我知道我可以使用非常有用的$positional操作符更新特定元素,如下所示: db.myCollection.update( {'array.name':

以这些数据为例

{ 
    "_id" : ..., 
    "array" : [
        { "name" : "value1","flag" : true } ,
        { "name" : "value2","flag" : false }
  ]
}
我想切换第二个数组元素(从false到true)

我知道我可以使用非常有用的$positional操作符更新特定元素,如下所示:

db.myCollection.update(
    {'array.name':'value2'},
    {
        $set: {
            'array.$.flag':true
        }
    },false,true);  
但是有没有一种方法可以将$positional操作符也用于值设置

e、 像这样

db.myCollection.update(
    {'array.name':'value2'},
    {
        $set: {
            'array.$.flag':'!array.$.flag' //<--
        }
    },false,true);  
db.myCollection.update(
{'array.name':'value2'},
{
$set:{

“array.$.flag':'!array.$.flag'/不,目前不可能。MongoDB不允许更新中的表达式依赖于文档中的字段。您必须在两个单独的操作中获取和设置表达式

但是,有一个技巧可以在一个操作中实现它(因此是原子的)。使用整数代替布尔值。然后偶数值将表示
,奇数-

// 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}});

谢谢,我担心是这样,所以这意味着,这不会是事务性的,对吗?@EranMedan:是的,但有一个解决办法。请参阅更新的答案。