2012-05-08 6 views
5

Considerate questi datiCome alternare un campo booleano in un elemento Array in MongoDB?

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

vorrei alternare l'elemento secondo array (da false a true)

so di poter aggiornare un elemento specifico utilizzando il molto utile $ operatore posizionale in questo modo:

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

Ma c'è un modo per utilizzare l'operatore di posizione $ anche per l'impostazione del valore?

ad es. come questo?

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

risposta

6

No, al momento non è possibile. MongoDB non consente espressioni negli aggiornamenti che dipendono dai campi nel documento. Dovrai ottenere e impostare in due operazioni separate.

Tuttavia, c'è un trucco per farlo in un'unica operazione (e quindi atomico). Invece di un valore booleano, avere un numero intero. Quindi anche i valori rappresenteranno false, quelli dispari - 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

Grazie, temevo che fosse così, quindi significa, non sarà transazionale, giusto? –

+2

@EranMedan: sì, ma c'è una soluzione alternativa. Vedi risposta aggiornata. –

Problemi correlati