2012-05-08 70 views
5

考慮這個數據如何切換MongoDB中的數組元素的布爾字段?

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

我想切換2個數組元素(從假到真)

我知道我可以用非常有用$位置操作這樣的更新的特定元素:

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

回答

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}}); 
+0

謝謝,我擔心它是如此,所以這意味着,這不會是事務性的,對吧? –

+2

@EranMedan:是的,但有一個解決方法。查看更新的答案。 –