2012-05-08 13 views
5

Considere estos datos¿Cómo se alterna un campo booleano en un elemento Array en MongoDB?

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

me gustaría cambiar el segundo elemento de la matriz (de falso a verdadero)

Sé que puedo actualizar un elemento concreto utilizando la gran utilidad del operador posicional $ como esto:

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

¿Pero hay una manera de usar el operador posicional $ también para la configuración del valor?

p. Ej. ¿Me gusta esto?

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

Respuesta

6

No, no es posible en este momento. MongoDB no permite expresiones en actualizaciones que dependen de los campos en el documento. Tendrá que obtener y establecer en dos operaciones separadas.

Sin embargo, hay un truco para hacerlo en una sola operación (y por lo tanto atómica). En lugar de un valor booleano, tenga un número entero. Entonces incluso los valores representarán false, impares - 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

Gracias, me temo que es así, entonces eso significa que no va a ser transaccional, ¿verdad? –

+2

@EranMedan: sí, pero hay una solución. Ver respuesta actualizada. –

Cuestiones relacionadas