the-little-mongodb-book/jaを読んだよ 3〜4まで
GitHub - ma2/the-little-mongodb-book: The Little MongoDB Bookを読んだメモ。
the-little-mongodb-book/jaを読んだよ 1〜2まで - 四角革命前夜の続き。
環境:Ubuntu 11.10 64bit / MongoDB 2.0.4 64bit
続きを始める前に
MongoDBの起動からシェルに入ってからデータベースを切り替えるところまで。……覚えてる?
$ ./mongod --config ./mongodb.config
$ ./mongo
> use learn
です。
ついでに関係ないけどメモ。
> show dbs > use [db_name] > show collections
検索を使いこなす
特定のフィールドを選択する検索は、findの第2引数にオブジェクトを渡すことでできる。
> db.unicorns.find(null, {name: 1})
これで_idフィールドとnameフィールドが返される。
> db.unicorns.find(null, {name: 1, _id: 0})
とするとnameフィールドだけが返される。
並び替え
findはカーソルを返して、実際の実行は必要になるまで遅延されるとか何とか。
sortを使うとわかるよ、とのこと。
> // 一番太ったユニコーン(weightの降順) > db.unicorns.find().sort({weight: -1}) > // nameで昇順にし、同じならvaimpiresの降順 > db.unicorns.find().sort({name: 1, vampires: -1})
> db.unicorns.find(null, {name: 1}).sort({name: 1})
とやるとnameの昇順。
ページング
limitとskipでページング。
> db.unicorns.find().sort({weight: -1}).limit(2).skip(1)
weightの降順でソートして、最初の結果を省いて2つ取る、でいいのかな。
「sortと一緒にlimitを使うのは、インデクスのないフィールドをソートするときの問題を避けるよい手段だ。」ってどういう意味だろう……まだわからない。
カウント
> db.unicorns.find({vampires: {$gt: 50}}).count()
countでドキュメントのカウント。
データモデリング
MongoDBの場合、結合はないので自分でもう一度クエリを発行する必要があるとか。
> db.employees.find({manager: ObjectId("4d85c7039ab0fd70a117d730")})
説明を読んでも意味がわからん…… RDB扱えないからなあ。
配列と埋め込みドキュメント
MongoDBの場合、結合できない代わりにフィールドに配列を持たせてゴニョゴニョできる。
> db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d733"), name: 'Siona',manager: [ObjectId("4d85c7039ab0fd70a117d730"), ObjectId("4d85c7039ab0fd70a117d732")]})
配列以外にも埋め込みドキュメントに対応しているので、ドキュメントのフィールドにドキュメントを含めることができる。
> db.employees.insert({_id: ObjectId("4d85c7039ab0fd70a117d734"), name: 'Ghanima', family: {mother: 'Chani', father: 'Paul', brother: ObjectId("4d85c7039ab0fd70a117d730")}})
この場合、findには
> db.employees.find({'family.mother': 'Chani'})
と書いて検索できる。
DBRef
(;´Д`)?? ???
非正規化
(;´Д`)?? ???
データが重複してもいいんじゃね?ってこと?
どちらを選べばいいか?
個々のドキュメントには4MBの制限がある。ということしかわからん……
> db.users.insert({name: 'leto', email: 'leto@dune.gov', account: {allowed_gholas: 5, spice_ration: 10}})
埋め込みドキュメントも使い方によっては楽だし良いよ、ってこと?