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

Era*_*dan 5 mongodb positional-operator

考虑这些数据

{ 
    "_id" : ..., 
    "array" : [
        { "name" : "value1","flag" : true } ,
        { "name" : "value2","flag" : false }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想切换第二个数组元素(从false到true)

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

db.myCollection.update(
    {'array.name':'value2'},
    {
        $set: {
            'array.$.flag':true
        }
    },false,true);  
Run Code Online (Sandbox Code Playgroud)

但有没有办法使用$ position运算符进行值设置?

比如这样?

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

Ser*_*sev 6

不,现在不可能.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}});
Run Code Online (Sandbox Code Playgroud)

  • @EranMedan:是的,但有一个解决方法.查看更新的答案. (2认同)