Pregunta

¿Hay alguna forma de alternar el campo booleano de un documento en MongoDB con operación atómica?Di, (en Python)

cl.update({"_id": ...}, {"$toggle": {"field": 1}})

¿Fue útil?

Solución

En este momento, no creo que sea posible hacer esto con una operación.Los operadores de bits (http://www.mongodb.org/display/docs/updating#updating-%24bit) no tienen un '$ XOR', aunque tengo un parche para ello.

En este momento, la solución, creo que piense es usar siempre '$ inc':

cl.update( { "_id": ...}, { '$inc' : { 'field' : 1 } } );

Luego, en lugar de verificarlo para Verdadero o Falso, puede verificar si un artículo es "Verdadero":

cl.find( { "_id": ..., 'field' : { '$mod' : [ 2, 1 ] } );

IE, usando el operador de módulo para ver si está incluso o desigual incluso con ser "desactivado", y se está "estableciendo".Si desea tener el comportamiento opposite (es decir, encontrar todos los elementos que no tengan el conjunto de bandera), luego use

[ 2, 0 ];

Otros consejos

The servidor-4362 El problema está realmente resuelto ahora y tiene el $bit Operador de actualización disponible.Así, junto con su xor argumento ahora puede hacerEsto en una acción atómica:

cl.findOneAndUpdate( 
  { "_id": ...}, 
  { 
     "$bit": { 
         "field": { "xor": NumberInt(1) } 
     } 
  },
  { "returnNewDocument": true, "upsert": true }
);

de modo que el valor del campo se mantenga en 0 o 1, lo que resultará un "giro" de bits que hace que el valor actual sea lo contrario de lo que fue en el momento de la modificación.

The .findOneAndUpdate() no es necesario, pero solo unManera de demostrar que el valor resultante es diferente en cada modificación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top