findAndModifyについて

MongoDBのクエリの一つ、findAndModify
便利なクエリなんだけど、制約も多いのでメモ。
MongoDBのドキュメントにも載っていることなので、詳しくはそちらを。

  • 更新は1ドキュメントのみ

要はfindOneして見つかったデータのみ更新されると思えば良い。
こんなかんじのクエリを実行しても、更新されるのは最初の1件のみ。

db.test.findAndModify({query : {hoge:{$in:["a", "b", "c"]}}, update : {$set:{foo:100}}})
  • shard keyを含まないクエリはエラーになる

これは知らずにやってしまうと結構問題になったりするかも。ローカルの環境ではshardingなんてやらないことがほとんどだと思うので。
sharding構成をとっている場合、検索のキーにはshard keyを含む必要がある。
これを満たしていないと問答無用でエラーにる。

// shard key : "hoge"の場合
// これはOK
db.test.findAndModify({query : {hoge:"a"}, update : {$set:{foo:100}}})
// これはアウト
db.test.findAndModify({query : {piyo:"a"}, update : {$set:{foo:100}}})