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}})

埋め込みドキュメントも使い方によっては楽だし良いよ、ってこと?

コレクションの数

コレクションは全くスキーマにかかわらないので、あらゆるドキュメントを1つのコレクションに全部入れることも可能。
ブログシステムの場合、postsコレクションとcommentsコレクションを作るか、postの中にcommentの配列を入れるか。
4MBの制限があるが、ハムレット全文は200KBに未たない。まあ、いいようにしろって感じ?

まとめ

モデリングも試せ


なんか後半が難しくてよくわからんが……
まあ、とにかく触れってことなのかな。習うより慣れろ。
今日はここまで。