読者です 読者をやめる 読者になる 読者になる

特定フィールドの一括更新方法

仕事中にターミナル上からMongoをいじれなかったので家で試す。
うむ、悔しい。

やりたいこと

条件を満たすコレクションの一部のフィールドを一括で更新する。

RDBMSとの違い

今までは

update テーブル名 set 列名1 = 値1, 列名2 = 値2 where 列名 = 条件

とかでいけたので、それでいけるかなーと思ってたら違ってました。
Mongoのマニュアルには以下のように書かれていました。

update() は、与えられた条件にマッチするドキュメント全体を新しいオブジェクトで置き換えます。一部の項目だけ更新したい場合には、下記のmodifierを使います。

そして次のようにも書かれていました。

もしSQLの経験がある場合、デフォルトでは update()は最初にマッチしたオブジェクトにのみしか更新しないことを理解してください。すべてのマッチするオブジェクトを更新したい場合には、 multi フラグを使ってください。

ちゃんとマニュアルは読まないといけないです。
一部だけ更新するときには、modifierアップデートというのを使います。

結論

こんな感じでやります。
ここでは、フィールドosが"Windows"であるコレクションのosフィールドを"Windows7"にしています。

db.servers.update({os:"Windows"},{ $set : {os : "Windows7"}}, false, true)

updateの第3、第4引数はそれぞれ以下のとおりです。
第3引数:upsert レコードが存在しないときにインサートするか?
第4引数:multi  条件を満たすオブジェクトをすべてアップデートするか。
また、$setの使い方は$set : {field : value } とすると、fieldにvalueをセットしてます。

参考

MongoDBマニュアル:アップデート
http://www.mongodb.org/pages/viewpage.action?pageId=7209549