Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8837

mongoDBで複数行をインクリメントしたい時

$
0
0

今回は、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というエラーが出るかもしれません。


Viewing all articles
Browse latest Browse all 8837

Trending Articles