MongoDBを触ってみる~導入・動作確認編~

はじめまして。SSTD 手塚です。
SIOSに入社して3年目になります。
SSTDは初期から担当していますが、ブログの執筆は今回が初めてとなります。
ちなみにですが・・・。
学生時代は今の業務とは異なることを学習していたため、知識ゼロからのスタートです。
どうぞ宜しくお願い致します。

今回の記事はMongoDBを触ってみるという記事になっているのですが・・・
題名を見てTreasureDataに関係ないじゃん!とか思う方もいらっしゃるかと思います。
私の執筆回は本題とは逸れた話がまじるんだなぁ程度で読んでくださればと思います。

なお、私の執筆回はゆるーく始まりゆるーく終わると思います。

と言うわけで、早速MongoDBを導入し、報告を行なっていきます。
報告を行なう前に今回の検証機を紹介します。

-検証機スペック-

OS:CentOS 5.x
メモリ:2GB
HDD:150GB
その辺にある仮想マシンを使います。
仮想マシンを使うのは何故かと言いますと、
後々Sharding,ReplicaSetの検証を行うため、
その都度物理マシン準備してるのもあれだなぁっていう何とも怠惰な理由です。

-MongoDBとは-

そもそもMongoDBとはなんぞやということで先人たちの情報(Wiki調べ)を元に紹介します。
MongoDBとはオープンソースのドキュメント指向データベース
言語としてはC++言語で記述が行われています。
NoSQLDBに分類されます。
「ドキュメント」と呼ばれる構造体でデータを持ちます。
このドキュメントをコレクション(TABLEのようなもの)にまとめて管理を行ないます。
コレクションは固定的なスキーマを持たないスキーマレスなもので、ドキュメントには複雑な階層構造を持たせることが出来ます。
RDBMSのように結合操作は効率的ではないのですが、データの追加・更新・削除・クエリを高速に行うことが出来ます。
ちなみにですが、データは特殊バイナリ形式でデータを持つのでUTF-8以外のデータでも保存・取得することが可能となっています。

なんて言っていても良く分からないので、早速導入してみることにします。

-MongoDBを導入する-

上記の検証機スペックのもと検証を行ないます。
MongoDBはyumコマンドを使ってインストールすることが可能なソフトウェアです。
yumコマンドを使ってインストールする場合、次の作業をyumコマンドを実行する前に行っておきましょう。

# vi /etc/yum.repos.d/10.gen.repo
#########以下編集内容##########
[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=0
###########ここまで#############

以下インストールコマンド
# yum --enalerepo=10gen install mongo-10gen-server.x86_64

これで完了します。
yumでインストールする関係上というか、yumの標準で見に行くリポジトリの中には
mongodb用のリポジトリは存在しないため、
自分で編集を行なって向き先を追加してあげる必要があるらしいです。
今回serverしか入れてないのですが、mongodb-client自身もこれで一緒に入ります。
これは依存関係にあるモジュールを自動的にインストールする際にmongodb-clientも入るからだと考えられます。
mongoが入ったことを確認するためにユーザとグループに"mongo"が追加されていることを確認しましょう。

# cat /etc/group | grep mongo
mongod:x:104:
# cat /etc/passwd | grep mongo
mongod:x:102:104:mongod:/var/lib/mongo:/bin/false

こんな感じで確認が出来ます。

-MongoDBを操作する-

特に設定ファイルを変更することなくmongodbを動かすことが出来そうなので、
設定ファイルを変更せず、mongodb-serverを立ち上げてみます。
# service mongod start
立ち上げを行なうと/var/log/mongo/mongo.logにstartingがログとして吐き出されるはずなので、確認を行います。

serverの立ち上げを行なった後、mongodbとの対話モードへ移行させます。
# mongo
と打ち込んで対話モードへ移行させましょう。
すると次のようなメッセージが出力され、対話モードへ移行します。
####################### ここから ######################
MongoDB shell version: 2.2.3
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
>
###################### ここまで #######################

立ち上げから対話モードまで移行出来たので実際に操作してみます。
####################### ここから ######################
> db.spam.save({hoge:"hogehoge",huga:"hugahuga"});
> db.spam.save({hoge:"spam",huga:"egg"});
> db.spam.find()
{"_id":ObjectId("513fcd4d67e73f9a8bbb7e1e"),"hoge":"hogehoge","huga":"hugahuga"}
{"_id":ObjectId("513fcd4a67e73f9e8bbb7e1f"),"hoge":"spam","huga":"egg"}
###################### ここまで #######################

操作出来ました。
RDBMSと比べてどうでしょうか。
RDBMSの場合、データベースを作成、テーブル作成、
その後クエリを発行してデータをインポートするかと思いますが・・・
MongoDBだと色々操作をすっ飛ばしてデータの格納が完了している気がします。
今回の操作は何をやっているかというと、
spamというコレクションの中にkey:hoge value:hogehogeとkey:huga value:hugahugaをドキュメントとして格納する。
さらにspamに対してkey:hoge value:spamとkey:huga value:eggを格納し、
spamコレクションに対して検索を実行している訳です。
今回、コレクション作成のための操作は何もしていないのですが、
saveメソッド?(呼び方としてこれでいいのか分からない)を呼び出した際に自動的にspamコレクションを作成しているらしいですね。
どうやら、ある程度の怠惰を許容出来るDBであることが伺えます。
うん。私向き

まだ、MongoDBを使ううま味がどこにあるのか分からないのですが、
今回はこの辺で。
次回、MongoDBについての記事を書くときはもうちょっと調査が進んでからになると思います。

まだまだ技術的にも知識的にも不十分な私ですが何卒宜しくお願い致します。

-本日のおさらい-

     
  1. MongoDBをインストールする(CentOS)
    1. # vi /etc/yum.repos.d/10.gen.repo
    2. # yum --enalerepo=10gen install mongo-10gen-server.x86_64
  2. MongoDBを立ち上げる
    1. # service mongod start
  3. MongoDBと対話する(MongoShellの起動?)
    1. # mongo
  4. MongoDBを操作する
    1. > db.collection_name.save({key:value,key:value});
    2. > db.spam.find()

SSTD@手塚