mongodbを使ってみる (6) - findAndModify -
探して更新、もしくは削除するようなケースだとfindAndModify使えば良い模様。という事で使ってみる
db.samples.save({ name: "hoge", type: 1 })
// 上記のドキュメントをクエリーして指定しつつ削除する
db.samples.findAndModify({ query: { name: "hoge" }, remove: true })
削除するケースがこんな感じで使える。
db.samples.save({ name: "hoge", type: 1 })
// 上記のドキュメントをクエリーで指定しつつ更新する
db.samples.findAndModify({ query: { name: "hoge" }, update: { $set: { type: 2 }}})
db.samples.find()
// 出力: { "_id" : ObjectId("50f635752d1cb50860945fe9"), "name" : "hoge", "type" : 2 }
という感じになる。でfindAndModifyの引数にnew: trueをすると更新された際に返す値が更新後の値を返すようになる。指定しなかったら更新前のデータが返される模様
で問題点としてこれマッチした最初のエントリーのみを更新される。つまり複数マッチした場合には色々と問題なのではと。そういう場合にはfindAndModifyを使うケースの設計段階でUNIQUEインデックスを考えるべきなのではっていう所だと思われる。あくまで個人的な意見ですけどね
ちなみにその最初にマッチしたエントリーっていうのはsortパラメーターによって制御する以外方法が無い模様
んまぁとりあえずは安全性的にどうかと思う所なんだけどそういう事もさっくり出来る
個人的には_idを判明させておけばsaveで更新も出来る模様なので、それ使った方が良いんじゃないかなって思う