the-little-mongodb-book/jaを読んだよ 5,7

GitHub - ma2/the-little-mongodb-book: The Little MongoDB Bookを読んだメモ。
the-little-mongodb-book/jaを読んだよ 3〜4まで - 四角革命前夜の続き。
環境:Ubuntu 10.04.3 LTS 64bit / MongoDB 2.0.4 64bit

MongoDBを使うのはどのような場合か

RDBの直接の代替手段、ねえ。代替であって置き換えではないのはRDBがうまくやれることもあるし、MongoDBがうまくやれることもあるから、と。
まあ、NoSQLにしては扱いやすい(?)方だとは思う。他のNoSQL扱ったこと無いけど。

スキーマレス

「でたらめなデータをすぐにデータベースに入れるかのように人々はスキーマレスを語る。」
著者の思うスキーマレス設計の本当の利点は、

ことの二つだそうで。まあ確かに。
オブジェクトJSONにしてあとは投げれば保存されるってラクチンだものね。

書き込み

こはちゃんと文章読んでおいた方が良いかも……


MongoDBは書き込みが高速なため、特に向いているのがロギング。

耐障害性

レプリケーションジャーナリングがどうのこうの

全文検索

今は機能としては無いが、配列サポートがあるので基本的な全文検索は簡単に実装できる。
LuceneやSolrなどのソリューションが〜って、この二つの作りを知らないのだけどMongoDBからでも扱えるのかな?

トランザクション

トランザクションが無いのでアトミック操作かツーフェーズコミットへのフォールバックとか何これ……
解説がOpen Source Document Database | MongoDBらしいが……

データ処理

MapReduceがなんとかかんとか

空間情報

$near(1点からの距離)や$within(矩形または円形の内部かどうか)なんて検索ができるみたい。すごい。

ツールと成熟度

他のRDBと比べてMongoDBはまだ若い。あとツール郡も整備されてない。
十進浮動小数点のサポートが無いのでお金を扱うシステムにとって懸案事項になる。てか普通そんなところにMongoDB使いませんて……
良い点として、言語用のドライバがたくさんあり、プロトコルがモダンでシンプルなのでものすごい勢いで開発されているところ。

まとめ

RDBからMongoDBに置き換え可能、単純でわかりやすく、より高速で、開発者に強いる制限もより少ない。
が、トランザクションがないのが懸案事項。

マップリデュース

理解出来ないと思うので飛ばす

性能とツール

いくつかのツールを見ていくことと、重要な側面についての説明。

インデクス

system.indexesという特別なコレクションは、データベースのインデクスに関する情報を保持している。
RDBのインデクスと同じように機能し、クエリとソートの性能を改善する。


ensureIndexで作り、dropIndexで削除をする。

> db.unicorns.ensureIndex({name: 1})
> db.unicorns.dropIndex({name: 1})


ユニークインデクスはunique=>trueを渡すことで生成される。

> db.unicorns.ensureIndex({name: 1}, {unique: true})


(インデクスは埋め込みフィールド上に作れるとか配列フィールド上に作れるとか複合インデクスが〜は省略されました)

Explain

クエリがインデクスを使うかどうかを見るにはカーソルで(?)explainを使う。

> db.unicorns.find().explain()
投げっぱなしの書き込み

データを書いたらそのまますぐに戻ってくるが、書き込みの失敗を知るにはdb.getLastErrorを挿入後に呼び出す必要がある。
ほとんどのドライバこれを隠蔽して追加のパラメータでsafe writeを出来るようにしてあるらしい。


シェルからはsafe writeを実行するので振る舞いは見ることは簡単ではない。

シャーディング

シャーディングの存在を知っておきましょう。

レプリケーション

性能向上をさせることもあるが、本来の目的は信頼性向上。
シャーディングと組み合わせることがよくある。存在を知っておきましょう。

統計

db.stats()でデータベースの統計情報を取得できる。
db.unicorns.stats()でコレクションに関する統計情報を取得できる。

Webインターフェース

MongoDB起動時のメッセージにWebベースの管理者ツールへのリンクが含まれている。らしい。それらしいの無いよ……
http://localhost:28017/にアクセスすると見れるらしい。
mongodb.configにrest=trueを追加してリスタートしたいと思うだろう、ってこれするとどうなんのさ?

プロファイラ

プロファイラを有効にするには

> db.setProfilingLevel(2)

を実行する。この状態でコマンドを実行し、

> db.unicorns.find({weight: {$gt: 600}})

プロファイラをチェックする。

> db.system.profile.find()

何が実行され、いつ、どのくらいのドキュメントがスキャンされ、どうやってデータが返されたかがわかる、らしい。


setProfilingLevelに0を渡すと無効化、1を指定すると100ミリ秒以上かかるクエリだけプロファイルする。

> db.setProfilingLevel(1, 1000)

とすると1秒以上かかる処理をプロファイルする、ということになるらしい。

バックアップとリストア

binディレクトリにmongodumpがあるが、これを実行するとローカルホストに接続して
すべてのデータベースをdumpディレクトリにダンプする。
特定のデータベースをバックアップする--db DBNAMEと特定のコレクションをバックアップする--collection COLLECTIONNAMEもよく使う。
リストアする場合はmongoresoreを、ダンプと同様に--dbと--collectionが使用できる。


learnデータベースをbackupディレクトリにバックアップするには以下のようにする。

$ mongodump --db learn --out backup

unicornsコレクションだけリストアするには、以下のようにする。

$ mongorestore --collection unicorns backup/learn/unicorns.bson


これら以外に、JSON or CSVからデータをインポート・エクスポートできるmongoexportとmongoimportがある。

$ mongoexport --db learn --collection unicorns

JSON出力を、CSV出力なら

$ mongoexport --db learn --collection unicorns --csv --fields name,weight,vampires

でできる。
ただ、mongoexportとmongoimportは常にデータを全部表現出来るとは限らないので、mongodumpとmongorestoreだけがバックアップに使われるべき。

まとめ

コマンドとかツールとかいろいろ見てきた。
MongoDBのインデクスはRDBのものと似ているが、的を射ており使いやすい。

結論

終わり。後半かなりいい加減だったけど。
でもまあ、なんとなくわかったし、触ってるうちに疑問点が解けることもあると思うので、これから触っていこうと思う。