2011-01-03 5 views
21

Ich bekomme eine "Feldname Verdopplung nicht mit Modifikatoren zulässig" Fehler beim Versuch, ein Feld in Mongo zu aktualisieren. Ein Beispiel:"Feldname Verdopplung nicht mit Modifikatoren zulässig" auf Update

> 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 

Gibt es keine Möglichkeit, diese atomare Operation durchzuführen? Ich möchte nicht zwei separate Updates dafür machen.

+0

Dies war das erste Google-Ergebnis, als ich diesen Fehler hatte. Mein Problem, mit Mungo, stellte sich heraus, dies zu sein: https://github.com/LearnBoost/mongoose/issues/1933 – Abby

Antwort

13

Es gibt eine noch offene Frage für den auf Mongo-Ticketsystem: http://jira.mongodb.org/browse/SERVER-1050

Sieht aus wie es für dieses Jahr geplant ist. Ihr Szenario ist definitiv ein vernünftiges Szenario, aber es ist auch an eine Reihe von Randfällen gebunden. Was passiert, wenn Sie $push und $pop auf ein leeres Array? Was wird erwartet? Was willst du, wenn du $push und $pull?

Ich möchte nicht zwei separate Updates dafür tun.

Ich weiß, dass dies wirklich "Code Geruch" hat, aber ist es ein vollständiger Blocker für die Verwendung dieser Lösung? Wird das "Doppel-Update" die Serverleistung komplett zerstören?

+2

Ich habe in den gleichen Fehler gerannt. Ich denke, dass das Problem der "doppelten Aktualisierung" hier ein ernsthaftes Problem ist, angesichts der Natur der MongoDB-Atomizität. Wenn Sie mehrere Anwendungen haben, die den gleichen Teil eines Arrays aktualisieren, möchten Sie wirklich nicht $ in einer Operation ziehen, dann $ in eine andere einfügen ... zwischen den beiden anderen Prozess möglicherweise das gleiche Array-Element, das geändert haben könnte zu einem schlechten/unerwarteten Verhalten führen. – jrista

+0

Ich stimme zu, da könnte es definitiv Datenprobleme geben. Aber es hängt wirklich davon ab, warum Sie diesen '$ push/$ pull' machen. In einigen Fällen erstellen Sie nur ein Warteschlangen-Array und die Reihenfolge ist möglicherweise nicht wirklich * das * große Problem. Basierend auf dem JIRA-Ticket ist es offensichtlich ein beliebtes Thema (* 53 Stimmen *), aber es wird auch als geringfügig und außerplanmäßig gekennzeichnet. Bei der derzeitigen Entwicklungsrate wird dies wahrscheinlich für viele Monate nicht der Fall sein. Das heißt, damit dies funktioniert, müssen Sie immer noch alle Randfälle ausbügeln. –

+2

Ich habe tatsächlich eine Lösung gefunden, während ich versuche, Nebenläufigkeitsprobleme zu lösen. Die neuesten Versionen von MongoDB unterstützen FindAndModify, und gekoppelt mit dem Array $ identifier (welches das aktuell gefundene Array-Element darstellt), können Sie ein bestimmtes Array-Element eines Dokuments in einer einzigen Operation finden und aktualisieren, die meiner Meinung nach atomar ist. Zumindest wird die Operation erfolgreich ohne Fehler abgeschlossen, und wir müssen noch auf ein Problem mit der Parallelität stoßen. ;) – jrista

Verwandte Themen