2012-02-27 11 views
13

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}}) 
+0

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

+0

Niestety, nie wyjaśniłem tego. Chciałbym operacji na oddzielnym dokumencie. – halfjuice

Odpowiedz

15

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 ];

+0

Ładne rozwiązanie, zaproponowane w podobny sposób w #mongodb;) Ticket w wyniku tej rozmowy tutaj https://jira.mongodb.org/browse/SERVER-4362 –

4

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.

+4

Czy istnieje sposób na użycie tego dla wartości logicznych zamiast liczb całkowitych? – mlovic

Powiązane problemy