2011-01-03 10 views
21

Podczas próby zaktualizowania pól w Mongo pojawia się błąd "Powielanie nazwy pola niedozwolone z modyfikatorami". Przykład:"Powielanie nazw pól niedozwolone z modyfikatorami" w aktualizacji

> db.test.insert({test: "test1", array: [0]}); 
> var testFetch = db.test.findOne({test: "test1"}); 
> db.test.update(testFetch, 
       {$push: {array: 1}, //push element to end of key "array" 
        $pop: {array: -1} //pop element from the start of key "array" 
       }); 
    Field name duplication not allowed with modifiers 

Czy nie można wykonać tej operacji atomowej? Nie chcę robić dwóch osobnych aktualizacji do tego.

+0

To był pierwszy wynik Google, gdy wystąpił ten błąd. Mój problem, używając mangusty, okazał się taki: https://github.com/LearnBoost/mongoose/issues/1933 – Abby

Odpowiedz

13

Jest wybitnym problemem dla tego systemu biletów na Mongo za: http://jira.mongodb.org/browse/SERVER-1050

Wygląda na to zaplanowane na ten rok. Twój scenariusz jest zdecydowanie rozsądnym scenariuszem, ale jest również powiązany z wieloma skrajnymi przypadkami. Co jeśli masz $push i $pop na pustej tablicy? Czego można się spodziewać? Co chcesz, jeśli masz $push i $pull?

Nie chcę robić dwóch osobnych aktualizacji do tego.

Wiem, że wykonanie tego naprawdę ma "zapach kodu", ale czy jest to kompletny bloker do korzystania z tego rozwiązania? Czy "podwójna aktualizacja" całkowicie zniszczy wydajność serwera?

+2

Wystąpił ten sam błąd. Myślę, że problem "podwójnej aktualizacji" jest poważnym problemem, biorąc pod uwagę charakter atomowości MongoDB. Jeśli masz wiele aplikacji, które mogą aktualizować tę samą część tablicy, naprawdę nie chcesz $ pobrać jednej operacji, następnie $ wypchnij inną ... pomiędzy dwoma innymi procesami mogły zmienić ten sam element tablicy, który może spowodować złe/nieoczekiwane zachowanie. – jrista

+0

Zgadzam się, z pewnością mogą tu wystąpić problemy z danymi. Ale to naprawdę zależy od tego, dlaczego robisz '$ push/$ pull'. W niektórych przypadkach po prostu budujesz tablicę kolejki, a kolejność może nie być * tą * dużą transakcją. Na podstawie biletu JIRA jest to oczywiście popularny numer (* 53 głosów *), ale jest również oznaczony jako nieistotny i niezaplanowany. Przy obecnym tempie rozwoju prawdopodobnie nie ujrzy światła dziennego przez wiele miesięcy. To stwierdzało, że aby to zadziałało, nadal musisz wyeliminować wszystkie skrajne przypadki. –

+2

Rzeczywiście znalazłem rozwiązanie, próbując rozwiązać problemy z współbieżnością. Najnowsze wersje MongoDB obsługują FindAndModify i są połączone z tablicą $ identyfikator (który reprezentuje aktualnie znaleziony element tablicy), możesz znaleźć i zaktualizować dany element tablicy dokumentu w pojedynczej operacji, która moim zdaniem jest atomowa. Operacja zakończy się pomyślnie bezbłędnie, a do tej pory nie napotkaliśmy problemu z współbieżnością. ;) – jrista

Powiązane problemy