Czy istnieje sposób przełączania pola logicznego JEDNEGO dokumentu w MongoDB z operacją atomową? Powiedz, (W python)Jak przełączyć pole boolowskie w jednym dokumencie z operacją atomową?
cl.update({"_id": ...}, {"$toggle": {"field": 1}})
Czy istnieje sposób przełączania pola logicznego JEDNEGO dokumentu w MongoDB z operacją atomową? Powiedz, (W python)Jak przełączyć pole boolowskie w jednym dokumencie z operacją atomową?
cl.update({"_id": ...}, {"$toggle": {"field": 1}})
W tej chwili nie sądzę, że można to zrobić z jedną operacją. Operatory bitowe (http://www.mongodb.org/display/DOCS/Updating#Updating-%24bit) nie mają "$ xor", mimo że mam na to poprawkę.
Teraz obejście myślę myśleć o to, by zawsze przy użyciu „$ inc”:
cl.update({ "_id": ...}, { '$inc' : { 'field' : 1 } });
Wtedy zamiast sprawdzania prawdziwe lub fałszywe, można zrobić sprawdzić, czy dany element jest „true”:
cl.find({ "_id": ..., 'field' : { '$mod' : [ 2, 1 ] });
IE, to za pomocą operatora modulo, aby zobaczyć, czy to nawet nierówny lub nawet z bycia „wyłączony”, a nierówna jest „set”. Jeśli chcesz mieć oppposite zachowania (tj znaleźć wszystkie elementy, które nie mają ustawioną flagę), a następnie użyć
[ 2, 0 ];
Ładne rozwiązanie, zaproponowane w podobny sposób w #mongodb;) Ticket w wyniku tej rozmowy tutaj https://jira.mongodb.org/browse/SERVER-4362 –
SERVER-4362 problem został rozwiązany i teraz faktycznie masz dostępne operator $bit
aktualizacji. Tak więc wraz z jego xor
argumentem można teraz zrobić to w działaniu atomowej:
cl.findOneAndUpdate(
{ "_id": ...},
{
"$bit": {
"field": { "xor": NumberInt(1) }
}
},
{ "returnNewDocument": true, "upsert": true }
);
Tak długo, jak wartość pola jest w 0
lub 1
następnie bitowe „przerzucania” spowoduje, że sprawia, że aktualna wartość przeciwieństwo tego, co było w czasie modyfikacji.
Numer .findOneAndUpdate()
nie jest wymagany, ale jest tylko sposobem na wykazanie, że wynikowa wartość jest różna przy każdej modyfikacji.
Czy istnieje sposób na użycie tego dla wartości logicznych zamiast liczb całkowitych? – mlovic
Operacje na oddzielnym dokumencie są atomowe, ale operacje na zbiorze dokumentów nie są atomowe. Czy chcesz zmienić flagę dla wszystkich dokumentów kolekcji? – Oleg
Niestety, nie wyjaśniłem tego. Chciałbym operacji na oddzielnym dokumencie. – halfjuice