Come attivare un campo booleano in un documento con il funzionamento atomico?
-
13-11-2019 - |
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}})
. 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.