データ更新時のModifier Operationsを試してみる
2011年5月12日
公式( -> http://www.mongodb.org/display/DOCS/Updating )に書いてあるので、とりあえず使ってみます。
updateを叩くので、まずレコードをひとつ用意しました。
db.test.save({ name:'hoge', age: 10 })
$inc
// nameがhogeのレコードのageを+2する db.test.update({ name: 'hoge' },{ $inc: { age: 2 } }) // 結果:{ name:'hoge', age : 12 } // もしageが存在しない状態でupdateした場合:{ name:'hoge', age : 2 } // ageが数字じゃない場合はエラー(Cannot apply $inc modifier to non-number)
$set
// nameがhogeのレコードのageを30に変更 db.test.update({ name: 'hoge' },{ $set: { age: 30 } }) // 結果:{ name:'hoge', age : 30 }
$unset
// nameがhogeのレコードのageを削除 db.test.update({ name: 'hoge' },{ $unset: { age: 1 } }) // 結果:{ name:'hoge' } // $unset時のvalueは何入れても消えるけど、なんでもいいのかな?
$push
// nameがhogeのレコードのhobby(array)の後ろに追加 db.test.update({ name: 'hoge' },{ $push: { hobby: 'anime' } }) // 結果:{ name:'hoge', hobby:['anime'] } // hobbyが存在しない場合は追加される // hobbyがarrayではない場合はエラー(Cannot apply $push/$pushAll modifier to non-array)
$pushAll
// nameがhogeのレコードのhobby(array)の後ろにまとめて追加 db.test.update({ name: 'hoge' },{ $pushAll: { hobby: ['music','photo'] } }) // 結果:{ name:'hoge', hobby:['anime','music','photo'] } // hobbyが存在しない場合は追加される // hobbyがarrayではない場合はエラー(Cannot apply $push/$pushAll modifier to non-array)
$addToSet
// 同じvalueが存在しない場合に追加 db.test.update({ name: 'hoge' },{ $addToSet: { hobby: 'sports' } }) // 結果:{ name:'hoge', hobby:['anime','music','photo','sports'] } // hobbyが存在しない場合は追加される // hobbyがarrayではない場合はエラー(Cannot apply $push/$pushAll modifier to non-array) // $pushとの違いは、$addToSetは、すでに存在するvalueは追加できない。 db.test.update({ name: 'hoge' },{ $addToSet: { hobby: 'sports' } }) // を再度叩いても、 // 結果:{ name:'hoge', hobby:['anime','music','photo','sports'] } // と、結果は変わらない。
$pop
// 後ろを削除 db.test.update({ name: 'hoge' },{ $pop: { hobby: 1 } }) // 結果:{ name:'hoge', hobby:['anime','music','photo'] } // 該当arrayの一番後ろの値を削除 // 前を削除 db.test.update({ name: 'hoge' },{ $popt: { hobby: -1 } }) // 結果:{ name:'hoge', hobby:['music','photo'] } // 該当arrayの一番前の値を削除
$pull
// 特定のvalueを削除 db.test.update({ name: 'hoge' },{ $pull: { hobby: 'music' } }) // 結果:{ name:'hoge', hobby:['photo'] } // 該当arrayから指定したvalueを削除 // { name:'hoge', hobby:['photo','music','photo','photo'] }のように、同じvalueが複数あった場合でも、まとめて削除される。
$pullAll
// 複数のvalueをまとめて削除 db.test.update({ name: 'hoge' },{ $pullAll: { hobby: ['music','photo'] } }) // 結果:{ name:'hoge', hobby:[] } // 該当のarrayから複数のvalueを指定して削除
とりあえずこのくらいで。
$renameと、$bitは、今の環境(version1.6)だと動かなかったんで、バージョン上げたら試してみる。