2014-06-18 7 views
6

Für MongoDB Ich bin auf der Suche nach atomaren update, die Feld wird erhöht und wenn dieses Inkrement die maximale angegebene Zahl übersteigt, wird es die maximale Anzahl stattieren. Dasselbe Verhalten kann mit einer Kombination von $ inc- und $ min-Operatoren erreicht werden, aber leider nicht in einem atomaren Update. Schauen Sie sich das Beispiel unten an.MongoDB Feld Inkrement mit max Bedingung in update-Anweisung

Beispiel Dokument

{ 
    "_id": 1, 
    "i": 0 
} 

Abfragen

db.test.update({_id:1}, {$set:{"a":"foo"}, $inc:{i:1}}); db.test.update({_id:1}, {$min:{i:2}}); 
db.test.update({_id:1}, {$set:{"b":"bar"}, $inc:{i:1}}); db.test.update({_id:1}, {$min:{i:2}}); 
db.test.update({_id:1}, {$set:{"c":"baz"}, $inc:{i:1}}); db.test.update({_id:1}, {$min:{i:2}}); 

Ergebnis Dokument

{ 
    "_id": 1, 
    "i": 2, 
    "a": "foo", 
    "b": "bar", 
    "c": "baz" 
} 

aktualisieren

Dank Christian P Antwort Ich erkannte, dass ich vergessen habe, eine weitere Bedingung zu erwähnen. Ich brauche ein Dokument, das aktualisiert werden muss, weil ich mehr Felder aktualisieren muss, als im Beispiel gezeigt wird. In der Tat brauche ich in der update-Anweisung inkrementieren Decke (maximal) Bedingung. Ich habe mein Beispiel aktualisiert, um dies deutlich zu machen.

Antwort

5

Sie suchen nach einem findAndModify Befehl:

db.test.findAndModify({ 
    query: { _id: 1, i: { $lt: 2 } }, 
    update: { $inc: { i: 1 } } 
}) 

Diese Abfrage das Dokument aktualisieren wird nur, wenn i nicht größer als der maximale Wert ist gegeben ..

+0

Vielen Dank für Ihre Antwort, die Sie‘ hast recht. Aber ich vergesse in Frage zu erklären, dass ich eigentlich mehr Felder mit der Abfrage aktualisieren muss, so dass ich nicht irgendein Dokument vom Update ausschließen kann, sehe mein Fragenupdate. –