2012-05-08 8 views
5

Betrachten Sie diese DatenWie kann man ein boolesches Feld in einem Array-Element in MongoDB umschalten?

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

Ich möchte das zweite Array-Element (von false auf true) wechseln

Ich weiß, dass ich ein bestimmtes Element aktualisieren, die sehr nützlich $ Positions Operator wie folgt aus:

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

Aber gibt es eine Möglichkeit, den $ positional-Operator auch für die Werteinstellung zu verwenden?

z.B. so was?

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

Antwort

6

Nein, das ist im Moment nicht möglich. MongoDB lässt keine Ausdrücke in Aktualisierungen zu, die von Feldern im Dokument abhängen. Sie müssen in zwei separaten Operationen erhalten und eingestellt werden.

Allerdings gibt es einen Trick, um es in einem Arbeitsgang (und daher atomar) zu machen. Geben Sie anstelle eines booleschen Werts eine ganze Zahl ein. Dann werden gerade Werte false darstellen, ungerade - 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

Danke, ich hatte Angst es ist so, also bedeutet es, es wird nicht transaktional sein, oder? –

+2

@EranMedan: Ja, aber es gibt einen Workaround. Siehe aktualisierte Antwort. –

Verwandte Themen