Domanda

C'è un modo per attivare il campo booleano di un documento in MongoDB con il funzionamento atomico?Dì, (in Python)

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

È stato utile?

Soluzione

In questo momento, non penso che sia possibile farlo con un'operazione.Gli operatori bitwise (http://www.mongodb.org/display/docs/updating#updating-%24bit) non hanno ancora un "$ xor" anche se ho una patch per questo.

In questo momento la soluzione alternativa penso che pensa sia sempre usando '$ INC':

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

Allora invece di controllare il vero o il falso, puoi verificare se un elemento è "True":

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

cioè, tu usi l'operatore del modulo per vedere se è anche o irregolare con persino essere "insensibile" e non uniforme "set".Se vuoi avere il comportamento dell'oppposite (cioè, trova tutti gli elementi che non hanno il set di flag), quindi utilizzare

[ 2, 0 ];

Altri suggerimenti

The Server-4362 Il problema è effettivamente risolto ora e hai il $bit Operatore di aggiornamento disponibile.Quindi, insieme a questo xor Argomento che puoi ora fareQuesto in un'azione atomica:

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

Finché il valore del campo è mantenuto a 0 o 1, quindi un "flip" bit a bit risulterà che rende il valore corrente il contrario di ciò che era al momento della modifica.

.findOneAndUpdate() non è richiesto, ma solo amodo di dimostrare che il valore risultante è diverso su ogni modifica.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top