the-little-mongodb-book/jaを読んだよ 1〜2まで

GitHub - ma2/the-little-mongodb-book: The Little MongoDB Bookを読んだメモです。
環境:Ubuntu 11.10 64bit / MongoDB 2.0.4 64bit

はじめる

MongoDB Download Center | MongoDBからOSにあったバイナリをダウンロード、書庫を展開する。
binディレクトリにmongodb.configファイルを作る。中身は

dbpath=./data

とした。dataディレクトリなんてbinディレクトリには存在しないので作る。

$ mkdir data

mongodを起動する。

$ ./mongod --config ./mongodb.config

mongoシェルを起動させて、バージョンを表示してみる。

> db.version()
2.0.4

MongoDBの基本

> db.help()

でコマンド一覧の表示。


データベースの切り替え。

> use learn

存在しなくてもOKです。なんて手軽なんでしょう。


ドキュメントは

> db.unicorns.insert({name: 'Aurora', gender: 'f', weight: 450});

で挿入。


コレクション名一覧は

> db.getCollectionNames()
[ "system.indexes", "unicorns" ]

で表示。system.indexesはインデクス情報保持だそうで。


ドキュメント一覧を表示するには

> db.unicorns.find()

で。

> db.system.indexes.find()

インデクス情報の中身が見れる。


さっき挿入したドキュメントと違う構造のドキュメントを入れても問題ない。

> db.unicorns.insert({name: 'Leto', gender: 'm', home: 'Arrakeen', worm: false})
セレクタを理解する
> db.unicorns.find({gender: 'm', weight: {$gt: 700}})

700ポンド以上のオスのユニコーンを検索する。


$exists演算子でそのドキュメントにフィールドが存在するかどうかを判定できる。

> db.unicorns.find({vampires: {$exists: false}})

この場合はvampiresフィールドを持たないドキュメントが検索される。


OR演算をしたい場合には$or演算子セレクタの配列を渡す。

> db.unicorns.find({gender: 'f', $or: [{loves: 'apple'}, {loves: 'orange'}]})

てな感じ。


これらの演算子はremoveでもcountでもupdate使えるみたい。

まとめ

セレクタで試して遊んで、覚えよう。

更新

updateの使い方。

> db.unicorns.update({name: 'Roooooodles'}, {weight: 590})

で更新。ただ、RDBのUPDATEと違うところがあって、この場合ドキュメントが“{weight: 590}で”置換される。
なので

> db.unicorns.find({name: 'Roooooodles'})

をしても見つからない。(weightフィールドしかないため)


指定したフィールドだけを更新したい場合は、$set修飾子を使う。

> db.unicorns.update({name: 'Roooooodles'}, {$set: {weight: 590}})
更新修飾子

$inc修飾子はフィールドを指定した数だけ増減するために使われる。

> db.unicorns.update({name: 'Pilot'}, {$inc: {vampires: -2}})

この場合はvampiresフィールドに-2が加算される。


$push修飾子は配列のフィールド(?)に値を追加できる。

> db.unicorns.update({name: 'Aurora'}, {$push: {loves: 'sugar'}})
更新型インサート(Upsert)

updateの第3引数にtrueを渡すと、ドキュメントが存在しない場合は挿入を、存在する場合は更新をしてくれる。

> db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}})
> db.hits.find()
> db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}}, true)
> db.hits.find()
{ "_id" : ObjectId("4f8d7f01bc421176346a99ce"), "hits" : 1, "page" : "unicorns" }
> db.hits.update({page: 'unicorns'}, {$inc: {hits: 1}}, true)
> db.hits.find()
{ "_id" : ObjectId("4f8d7f01bc421176346a99ce"), "hits" : 2, "page" : "unicorns" }
多重更新(Multiple Update)

updateはデフォルトではひとつのドキュメントのみ更新する。セレクタに一致するすべてのドキュメントを更新するには第4引数をtrueにする。(第3引数はなんだろう?)

> db.unicorns.update({}, {$set: {vaccinated: true}}, false, true)
> db.unicorns.find({vaccinated: true})


とりあえず今日はここまで。これで大体半分に行かないくらいかな。
とっても読みやすく、わかりやすくて助かる。