今日も適当ダイアリー

PHP や Javascript や Symfony、BEAR.Sunday などのWeb周りのことを中心に。それ以外のことも気まぐれに投稿します。

2.0 からはじめる MongoDB - 第1回 #mongodbjp

勉強会用の名刺が届いてウハウハ(?)な @madapaja です。

関連記事もどうぞ

この連載では MongoDB をこれからはじめる方に向けて、MongoDB 2.0 で追加された機能を含んだ、MongoDB 全体を広くご紹介していきたいと思っています。

今回のアジェンダ

  • なぜ MongoDB か
  • MongoDB のインストール
  • MongoDB シェルと戯れる

なぜ MongoDB か

MongoDB はここ1~2年で注目が高まった、NOSQL(Not Only SQL)と呼ばれる、“非”RDBMS(Relational DataBase Management System)なデータベースの一つです。
様々な所で議論されているように、NOSQL データベースは既存の RDBMS に完全に置き換わる存在ではなく、それぞれの長所・短所を理解した上で、RDBMS と NOSQL をうまく組み合わせることで、より柔軟でスケールしやすいシステムを作ることが可能でしょう。

さて、その NOSQL の中でも MongoDB が注目されている理由は、その「簡単さ」にあるでしょう。MongoDB にはインストール、運用、クエリ(問い合わせ)、インデックスなど様々な点でエンジニアが思ったことを実現する機能が充実しています。特にクエリやインデックスの機能については、柔軟で豊富なクエリと、どの属性に対してもインデックスを作成できるフル・インデックスのサポートにより、既存の RDBMS からの移行でも戸惑うことなく開発に専念させてくれます。

もう少し後押しするために、採用実績にも触れておこうと思います。
採用実績は、公式サイトの Production Deployments に掲載されていますので、その中からいくつかピックアップしてご紹介します。

Disney
インタラクティブメディアグループ内のすべてのゲームの共通のツールと API の、ステータス情報を保持するコモン・オブジェクト・リポジトリとして MongoDB が使われています。
foursquare
位置ベースのソーシャルネットワークである foursquare は、場所と場所へのユーザー「チェックイン」を保持するために、MongoDB が使われています。
bit.ly
リンクの短縮、シェアとトラッキングを行える bit.ly では、MongoDB がユーザー履歴を保持するために使われています。
SourceForge
MongoDB が SourceForge の全プロジェクトのフロントページ、プロジェクトページ、ダウンロードページのバックエンドストレージとして使われています。
github
ソーシャルコーディングサイトの GitHub では、内部のリポーティングアプリケーションで MongoDB が使われています。
株式会社プリファードインフラストラクチャー
株式会社プリファードインフラストラクチャーの、様々な検索ニーズに対応する“統合検索プラットフォーム”Sedue(セデュー)では、現在、MongoDB を使用して柔軟性、可用性の高い方法でドキュメントが保存されています。
CyberAgent, Inc.
CyberAgent, Inc. では、Ameba Pico(ピグの海外版)、Ameba tappie(タッピー)サービスにて MongoDB が使われています。

では、そろそろ実際に MongoDB を触れて、その世界を体験していただきたいと思います。
MongoDB が柔軟で、パワーがあり、スピードが出て、簡単に使えるように設計されている、ということを第0回から紹介してきたわけですが、その思想は至る所に現れています。
もちろんインストールやコンソールも例外ではありません。いかに簡単でパワフルかを触りながら実感して頂ければと思います。

MongoDB のインストール

MongoDB は様々なプラットフォームへ簡単にインストールできます。MongoDB ダウンロードページ には、Mac OS X、Linux、Windows、Solaris用のバイナリが提供されています。また、必要であればソースコードを自分でコンパイルすることもできます。
ここでは、いくつかの OS へのインストール方法を紹介していきます。

なお、各OS共に 32bit 版と 64bit 版の2種類が用意されていますが、64bit OS であれば 64bit 版のインストールを推奨します。32bit 版の MongoDB プロセスは、約 2.5GB のデータに制限されます。

Mac OS X へのインストール

Mac OS X へのインストールにはパッケージマネージャを使うのが楽です。ここでは、Homebrew でのインストール方法をご紹介します。
Homebrew で MongoDB をインストールするには、ターミナルで下記のコマンドを実行します。


$ brew update
$ brew install mongodb

インストール時に表示されるメッセージに従って、インストールを完了させます。
初めてのインストールで、ログイン時に自動起動させる場合は、以下のような感じになります。


$ mkdir -p ~/Library/LaunchAgents
$ cp /usr/local/Cellar/mongodb/2.0.0-x86_64/org.mongodb.mongod.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/org.mongodb.mongod.plist
Linux へのインストール

ここでは、パッケージを使ったインストール方法をご紹介します。

CentOS / Fedora へのインストール

yum リポジトリが提供されているので、お使いのシステムに合わせて /etc/yum.repos.d/10gen.repo に下記を書いて、リポジトリを登録します。

64bit 版


[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0

32bit 版


[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0

その後、yum でインストールし MongoDB サーバーを起動しましょう。


$ sudo yum install mongo-10gen mongo-10gen-server
$ sudo /etc/init.d/mongod start

なお、システム起動時に開始するようにしたい場合は、chkconfig コマンドで登録します。


$ sudo chkconfig --add mongod
Ubuntu へのインストール

apt リポジトリが提供されています。
ここでは、最近の Ubuntu へのインストール方法を紹介しますが、 SysV 形式の init スクリプト(Debian Lenny や 古い Ubuntu)の場合は、 MongoDB マニュアルの Ubuntu and Debian packagesを参照してください。

最初に、下記のコマンドで GPG キーを登録します。


$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

その後、/etc/apt/source.list に下記を追記し、リポジトリを登録します。


deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

下記コマンドで MongoDB をインストールします。


$ sudo apt-get update
$ sudo apt-get install mongodb-10gen
Windows へのインストール

Windows へのインストールは、インストーラなどがないため少しだけ作業が必要です。

MongoDB ダウンロードページ から、Windows 用のバイナリをダウンロードします。
解凍すると「mongodb-win32-XXXX-2.0.0」のようなフォルダが出来るので、それを適当な場所に移動させます。(ここでは、mongo にフォルダ名を変え、c:\mongo に設置したものとします。)

データディレクトリの作成

エクスプローラなどで DB データが保存されるディレクトリを作成します。


c:\data\db
サービスとして登録する

Windowsキー + R で、cmd と入力してコマンドプロンプトを表示し、以下のコマンドでサービスとして登録します。


c:\> cd c:\mongo\bin
c:\mongo\bin> mongod --install --logpath c:\mongo\logs --logappend --bind_ip 127.0.0.1

サービスとして登録されたら、以下のコマンドで MongoDB をスタートさせることができます。


c:\mongo\bin > net start "MongoDB"

MongoDB シェルと戯れる

さて、詳しくは次回より紹介していきますが、ここで終わるのもなんなので、少しだけ MongoDB シェルに触れて今回は終わることにしましょう。

MongoDB シェルの起動と終了

>MongoDB シェルの起動は、mongo コマンドで行います。


$ mongo

コマンドを実行すると、下記のように表示され MongoDB シェルのバージョン 2.0.0 が起動し、test データベースに接続されたことが分かります。


MongoDB shell version: 2.0.0
connecting to: test
>

また、MongoDB シェルを終了するには exit コマンドを入力します。


exit
MongoDB シェルの特徴

MongoDB シェルは Firefox などの Javascript エンジンである SpiderMonkey を拡張した、Javascript シェルになります。今後の説明では特に明記がない限りは、このシェル上での実行例となります。
では、まずシェル上で簡単な Javascript を実行してみたいと思います。


var data = []; // 配列を初期化

for (var i = 0; i < 1000; i++) {
// 配列に num, text 値を持ったオブジェクトを追加
data.push({
num: i,
text: 'test' + i
});
}

上記の例では、何も DB への操作をしていませんが、Javascript が実行されているため、


print(data.length);
print(data[100].text);

と実行すると、


1000
test100

とそれぞれ返って来ると思います。
この機能は、テストデータを挿入する場合などにも非常に便利に使えるでしょう。

では、少しだけ DB への操作もしてみましょう。
MongoDB のコマンドやクエリを知らなくても、その雰囲気を感じていただければと思います。
まずは、データの保存です。先ほどのデータを保存します。


use first_mongo; // DB の選択

for (var i = 0; data.length; i++) {
db.test.save(data[i]);
}

4 行目で保存をしているのが MongoDB を知らなくても何となく分かるかと思います。
次にデータがきちんと保存されているかを確認したいと思います。まずは、データ件数を確認してみます。


db.test.count();

正常に保存されていれば、1000 と返って来るはずです。
実際に保存されたデータも確認してみましょう。下記のコマンドで保存されたデータを取得します。


db.test.find();

すると、下記のように保存されているデータが返って来るはずです。(ObjectId という部分の値は環境によって異なります。)


{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d1ff"), "num" : 0, "text" : "test0" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d200"), "num" : 1, "text" : "test1" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d201"), "num" : 2, "text" : "test2" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d202"), "num" : 3, "text" : "test3" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d203"), "num" : 4, "text" : "test4" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d204"), "num" : 5, "text" : "test5" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d205"), "num" : 6, "text" : "test6" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d206"), "num" : 7, "text" : "test7" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d207"), "num" : 8, "text" : "test8" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d208"), "num" : 9, "text" : "test9" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d209"), "num" : 10, "text" : "test10" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d20a"), "num" : 11, "text" : "test11" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d20b"), "num" : 12, "text" : "test12" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d20c"), "num" : 13, "text" : "test13" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d20d"), "num" : 14, "text" : "test14" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d20e"), "num" : 15, "text" : "test15" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d20f"), "num" : 16, "text" : "test16" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d210"), "num" : 17, "text" : "test17" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d211"), "num" : 18, "text" : "test18" }
{ "_id" : ObjectId("4e78ab3e4e6d38925bd6d212"), "num" : 19, "text" : "test19" }
has more

データ挿入時に指定していない "_id" という値が定義されている以外は、データが保存されているようです。
なお、MongoDB シェルでは 1 画面で 20 件までのデータしか表示しません。その次のデータを見るためには it (iterate の略)と入力する事で、次の 20 件のデータを表示します。

それでは、今日はここで終わりですので、遊んだデータについては削除しておくことにしましょう。


use first_mongo;
db.dropDatabase(); // first_mongo データベースを削除

まとめ

今回は MongoDB をインストールし、実際に MongoDB シェルでいくつかの処理を行ってみました。
まだ何も MongoDB について説明していないような気がしますが、その雰囲気だけでもつかんで頂ければと思います。

さて、次回からは MongoDB シェルを使って MongoDB の様々な機能に入っていきたいと思います。

関連記事もどうぞ