データ更新時のModifier Operationsを試してみる

公式( -> 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)だと動かなかったんで、バージョン上げたら試してみる。