今回は、1つのステートメントで1つのドキュメントに対して複数のmongo更新をする話について紹介します。
(mongo2.4環境)
例えば、カラムaとカラムbの複数行のレコードをinc
値だけ増やしたい時。
db.test.update({"name":"sample_data"},
{$inc:{a:inc}, $inc:{b:inc});
このようにして書くと、bの数値だけ増加します。
複数$incを付けた場合、最後のステートメントだけ反映される仕様のようです。
以下のようにして解決します。
db.test.update({"name":"sample_data"},
{$inc:{a:inc, b:inc});
これで、aとb両方の数値がインクリメントされます。
なお、「この値は増加させて、このフィールドをセットして…」と、$inc
と$set
を組み合わせる場合もあるかと思います。
その場合は、ドキュメントの異なる部分に影響を与える場合は、複数の更新を組み合わせることができます。
db.test.update({"name":"sample_data"},
{$inc:{a:inc, b:inc}, $set{c:"test"});
上記は可能ですが、
db.test.update({"name":"sample_data"},
{$inc:{a:inc, b:inc}, $set{b:30});
このような競合はNG,という話。
競合すると、have conflicting mods in update
というエラーが出るかもしれません。