6

考虑这些数据

{ 
    "_id" : ..., 
    "array" : [
        { "name" : "value1","flag" : true } ,
        { "name" : "value2","flag" : false }
  ]
}

我想切换第二个数组元素(从假到真)

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

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

但是有没有办法将 $ 位置运算符也用于值设置?

例如像这样?

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

1 回答 1

9

不,目前不可能。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}});
于 2012-05-08T21:40:36.470 回答