はじめに
NoSQLというキーワードが注目を集めてから数年たちます。NoSQLというものを簡単におさらいすると、NoSQLとはNot Only SQLの略語であり、データベースの形式としてこれまで大勢を占めて主流であったRDBMS(Relational DataBase Management System)に対抗する概念として登場しました。近年のデータ増やWebアプリケーションにおけるスケーラビリティの必要性から、従来のRDBMSでは構造的に適さないデータ構造のシステムやRDBMSが抱える問題を解決するものとして数多くのデータベースが登場しています。現在、NoSQLの大きな分類としては3種類にわけられています。
キー・バリュー型
キーと値(バリュー)という比較的単純な構造のデータベース。代表的なものはRiak、Redis、Memcachedなど。
ドキュメント志向
1件のデータをドキュメントと呼び、データ構造が自由でスキーマレスな構造のデータベース。代表的なものはMongoDB、CouchDB。
列志向
キーに対して代表的なものはHBase、Cassandra。
本連載ではこれらNoSQLと呼ばれるデータベースの中から、MongoDBを取り上げます。連載は2回にわけて行い、第1回では、MongoDBのインストールから、基本操作を通してMongoDB特有の概念やデータの扱い方を解説します。第2回では、JavaのアプリケーションフレームワークであるSpringのサブプロジェクトであるSpring Dataを使ってMongoDBを利用したアプリケーションの開発を解説します。
MongoDBとは
MongoDBとは、アメリカの10gen社によって開発が行われている非常にスケーラブルで高性能なオープンソースのドキュメント指向データベースです。Windows/Linux/MacOS/Soralisの各種プラットフォーム向けのバイナリを配布している他、ライブラリもJava/Ruby/Python/PHPなど多くの言語に対応しています。
MongoDBの特徴として、データがBSON(Binary JSON)という形式で保存されることです。BSONとはJSON(JavaScript Object Notation)ライクなドキュメントをバイナリ形式にシリアライズしたものであり、JSON同様に名前と値のペアの集まりによってデータを表現します。
また、KVSとは異なってクエリを用いて非常に複雑なデータ検索も可能です。それ以外にもインデックスのサポートやレプリケーション、オートシャーディングといった非常に豊富な機能を備えてるNoSQLデータベースといえます。一方、MongoDBが備えていないものとして代表的ものはトランザクションです。またSQLのJOINのようなオペレーションも行えません。トランザクションは使えませんが、1ドキュメントに対するアトミックな処理はサポートされています。
このような特徴を持つMongoDBですが、筆者の個人的な感想を言わせていただくと、KVSよりはなじみやすくRDBMSより柔軟といった感じで、非常に使い勝手がいいものだと思います。また、クエリなどの基本操作が非常に直感的であることから、初心者にも使いやすいだけでなくRDBMSの利用者からも移行がしやすいと思われます。
MongoDBのインストール
では、早速MongoDBをインストールしていきたいと思います。MongoDBはインストールも非常に簡単です。先述したようにMongoDBはWindows/Linux/MacOS/Soralisをサポートしており、これらのプラットフォーム向けのバイナリが配布されています。また、yumやhomebrewなどの各種プラットフォームのパッケージ管理システム向けのパッケージも用意されています。今回は例として配布されているバイナリを利用したMac OS Xでの導入を紹介しますが、この方法の場合、どのプラットフォームでも手順は大きく変わりません。公式サイトのダウンロードページからお使いの環境にあわせてダウンロードしてください。
ではまずは、ダウンロードサイトから任意のディレクトリにバイナリファイルをダウンロードして展開します。今回は記事執筆時点で最新の2.2.2を使っています。
$ wget http://downloads.mongodb.org/osx/mongodb-osx-x86_64-2.2.2.tgz $ tar xvfz mongodb-osx-x86_64-2.2.2.tgz x mongodb-osx-x86_64-2.2.2/GNU-AGPL-3.0 x mongodb-osx-x86_64-2.2.2/README x mongodb-osx-x86_64-2.2.2/THIRD-PARTY-NOTICES x mongodb-osx-x86_64-2.2.2/bin/mongodump x mongodb-osx-x86_64-2.2.2/bin/mongorestore x mongodb-osx-x86_64-2.2.2/bin/mongoexport x mongodb-osx-x86_64-2.2.2/bin/mongoimport x mongodb-osx-x86_64-2.2.2/bin/mongostat x mongodb-osx-x86_64-2.2.2/bin/mongotop x mongodb-osx-x86_64-2.2.2/bin/mongooplog x mongodb-osx-x86_64-2.2.2/bin/mongofiles x mongodb-osx-x86_64-2.2.2/bin/bsondump x mongodb-osx-x86_64-2.2.2/bin/mongoperf x mongodb-osx-x86_64-2.2.2/bin/mongosniff x mongodb-osx-x86_64-2.2.2/bin/mongod x mongodb-osx-x86_64-2.2.2/bin/mongos x mongodb-osx-x86_64-2.2.2/bin/mongo
次にデータ用のディレクトリを作成します。MongoDBは、標準では/data/dbにデータを書き込みます。従って今回は/data/dbというディレクトリを作成します。なお、起動時のコマンドラインのオプションで--dbpathを指定すると、標準ディレクトリ以外をデータディレクトリとして利用できます。
$ mkdir -p /data/db
インストールは以上です。では続いて起動してみましょう。起動に使用するコマンドはmongodです。同じディレクトリにはmongoというコマンドもありますので、間違いのないようにしましょう。
$ cd mongodb-osx-x86_64-2.2.2 $ ./bin/mongod
起動が開始するとメッセージが表示され、最後に"waiting for connections on port 27017"というメッセージが表示されていれば起動は成功です。
なお、この起動の仕方ではフォアグラウンドで起動されているため、ログアウトするとプロセスも停止します。デーモンとしてバックグラウンドで起動するには、mongodコマンドの実行時に--forkオプションをつけて実行してください。ただし、バックグラウンドで起動する場合は、あわせて"--logpath"もしくは"--syslog"オプションの指定が必要です。これらは、標準出力に出力されるログメッセージをファイルにロギングするためのオプションです。その他の細かいオプションは"mongod -h"で確認することができます。
続いて、起動したMongoDBに対してMongoDBクライアントを使って接続してみます。MongoDBクライアントは対話型のシェルとなっており、mongodと同じディレクトリにあるmongoコマンドで起動します。
$ ./bin/mongo MongoDB shell version: 2.2.2 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 >
MongoDBクライアントの実行時に何もオプションを指定しない場合は、自動的にローカルのMongoDB(localhostの27017ポート)のtestというデータベースに接続されます。なお、このツールはJavaScriptのシェルで、MongoDBのコマンドを実行できるだけでなくJavaScriptの実行が可能となっています。本記事では以降、MongoDBクライアントのことは単にシェルと呼びます。