humongousは英語で「ばかでかい」という意味で、MongoDBのmongoはこの単語が由来です。

MongoDBのロゴの葉っぱと合わせて考えると、とても大きな木のイメージが浮かんできます。

MongoDBの開発オフィスには切り株や観葉植物が置いてあるらしいです。

本記事ではMongoDBの使いどころ・メリット・デメリット、そしてMongoDBの使い方について説明します。

MongoDBの基本を押さえて正しく使える状態を目標にしましょう。

またMySQLとの連携方法や移行方法についても解説します。

MongoDBとは

MongoDBはオープンソースのドキュメント指向型データベースです。

有名なプロダクトではUber・SourceForge・AmebaがMongoDBを採用しています。

2009年という後発にも関わらず、人気のあるデータベースとして高順位をキープし続けているシステムです。

互換性のあるデータベースにAmazon DocumentDBがあります。


MongoDBの特徴

MongoDBの分類であるドキュメント指向型データベースについて説明しましょう。


NoSQLデータベース

MySQLやPostgreSQLはRDB(Relational Database)、DynamoDBやMongoDBはNoSQL(Not Only SQL)データベースです。

NoSQLデータベースには以下の種類があります。

  • KVS(Key-Value Store・キーバリューストア)
  • 列指向型
  • ドキュメント指向型
  • グラフ型

RDB以外のデータベースがNoSQLデータベースです。テーブル以外の多種多様な形式を保存に用います。


ドキュメント指向型データベース

MySQLやPostgreSQLは行指向データベース、DynamoDBやBigTableは列指向データベースです。

MongoDBやCouchDBはドキュメント指向型データベースで、これらのいずれでもありません。

自由度の高いドキュメントという形式でデータを格納するデータベースです。1ドキュメントには1件分のデータを書き込めます。

またドキュメントのフォーマットに定義はなく、都度異なるデータ構造で書き込むことができるスキーマレスなデータベースです。

ドキュメントの集まりをコレクションと呼びます。


MongoDBのメリット

MongoDBのメリットを確認していきましょう。


スケールアウトが可能

MongoDBはシャーディングという負荷分散の仕組みを有しています。またオートシャーディングによるオートスケーリングも可能です。

この仕組みにより全体のパフォーマンスが向上し、スケールアウトも容易になります。


レプリカセットによる高可用性

レプリケーションは障害発生時にあらかじめ用意しておいた別のサーバーやコンテナを動かすシステムです。

MongoDBにはレプリカセットという機能があります。

あらかじめ3台以上のサーバーを用意し常にデータの同期を取っておくことで、障害発生時に直ぐに切り替えられるようにする仕組みです。

このサーバーには優先順位付けによって、読み出しの細かい設定を行うことができます。


大容量データを高速操作

インメモリで動作するため処理速度が速く、大量のデータを迅速に処理することが可能です。

ただしメモリに乗り切らないほど容量のあるデータに対して処理をしようとすると、性能を活かしきれないため注意して下さい。


動的スキーマ設計

普通RDBではデータベース定義書を作成し、細かい部分まで厳密に設計を行ってから開発に取り掛かる必要があります。

MongoDBはドキュメント指向型データベースなので、後からドキュメントの構造を変更することが容易です。


MongoDBのデメリット

MongoDBのデメリットを確認していきましょう。


一貫性を保持しない

MongoDBはあえて一貫性を保持しようとしていません。

大体のデータが分かれば良い場合、データの一貫性を保つ方が高コストです。

この制限の緩和は同時に水平スケールも可能にします。


集計用のQUERY関数が使えない

GROUP BY・SUMなどの集計用のQUERY関数が使用できません。

このためMongoDBは代わりとなる手段として、Aggregation・Map-Reduceなどの機能を用意しています。

慣れているSQL構文は使用できないので、これらの方法に慣れる必要があるでしょう。


適切なインデックス設計

MongoDBではインデックスを作成しすぎると、インデックスサイズの肥大化やパフォーマンスの低下を招きます。

MongoDBがメモリ上で処理を行うとき、インデックスを含むデータを読み込むためです。

またドキュメント数が多いと新しいインデックスを貼る際に時間がかかります。

スキーマ設計を後回しにできるとはいえ、MongoDBのキーやインデックスについては最初に少々考慮しておくと良いでしょう。


MongoDBの使いどころ

RDBとNoSQL、KVSとドキュメント指向型など沢山の種類があるのは、各々に最適な場面があるからです。

MongoDBにも使いどころがあります。


裁量権が大きいプロジェクト

スキーマ設計をある程度自由に行える開発であれば、動的スキーマ設計により開発スピードを上げることができるでしょう。

またクラウドの利用が可能であれば、スケーリングやフェイルオーバーなどの運用をクラウド側に委託できます。

コスト的に融通が効くようであれば、適切なリソースの使用により安定した環境を構築することができるでしょう。


RDBと組み合わせる

基本データをRDBで管理し、データ量が甚大になる部分にはMongoDBを採用するという具合に使い分ける方法です。

トランザクションが必要な処理に用いるデータや、複雑なクエリや正規化が必要な基本データはRDBで管理します。

そして個々のユーザーに紐付く大量のデータはMongoDBで管理するという手法です。

具体的にはゲームアカウントのインベントリや設定の情報、ソーシャルサイトの行動ログなどがこれに当てはまります。

MongoDBの使い方

インストールや準備については割愛し、ここではMongoDBの基本的な使い方を説明しましょう。

環境情報は以下です。

  • MongoDB v4.2.5
  • Mongo Express v0.54.0


MongoDB shell

以下のコマンドでMongoDBに接続します。

  1. $ mongo

以下はadminデータベースにユーザー名とパスワードを指定して接続する例です。

  1. $ mongo admin -u root -p password

接続するデータベースを切り替えるには「use データベース名」コマンドを使用します。

  1. > use config
  2. switched to db config

「show databases」はデータベース一覧を表示するコマンドです。データ容量も共に表示されます。

このコマンドにはエイリアスが設定されており、「show dbs」でも同様の操作が行えますので試してみて下さい。

  1. > show databases
  2. admin 0.000GB
  3. config 0.000GB
  4. local 0.000GB

これらのコマンドは「help」で確認が可能です。

  1. > help

左側にコマンド・右側に説明が記載されていますので、その他のコマンドについてはこちらを参照して下さい。


Mongo Express

Mongo ExpressはMongoDBの管理をブラウザ経由で行うことができるWebアプリケーションです。

GUIツールなのでCLIに不慣れでも問題ありません。

トップページからデータベース一覧・サーバーの状態を確認できます。データベース・コレクションも同様の画面で確認可能です。

コレクションに対してエクスポート・インポート・削除などの操作が行えます。

またドキュメントに対して雛形ダウンロード・JSONやCSV形式でのエクスポート・インポート・圧縮・削除などが可能です。

MySQLのphpMyAdminと似たようなツールと捉えて頂ければよいでしょう。


MySQLとは

MySQLはオープンソースの行指向型データベースです。

WordPress・DrupalなどのCMSに採用されているので、ご存知の方も多いと思います。LAMP環境を構築する際にも必要なデータベースです。

MySQLは他のデータベースに比べ知名度が高く、一般向けのプロダクトに多く利用されています。

一方でYahoo!やFacebookなどの大手企業の大規模Webアプリケーションでも活躍している、極めて守備範囲の広いデータベースです。


RDB

RDBでは使い慣れたSQL構文でクエリを投げることができます。

データを2次元の表で格納しておき、データが必要になったときに複数の表を組み合わせて結果を得るデータベースです。

事前にスキーマ設計を細部まで詰める必要があるため、開発初期に時間がかかるかもしれません。

RDBMS(Relational DataBase Management System)はリレーショナルデータベース管理システムの略です。

RDBMSは不正操作からRDBを保護したり、トランザクション機能やロールバックなどの仕組みでデータの整合性を保ったりします。


行指向型データベース

行単位でデータを操作するデータベースです。既存の多くのデータベースは行思考型データベースでしょう。

ビッグデータを取り扱う最近のデータベースの中には列指向型のデータベースも存在します。

特定のレコードを取得して操作するのが容易な反面、集計・統計処理をする際は全てのレコードを走査しなければなりません。


MongoDBとMySQLとの違い

MongoDBはドキュメント型データベース、MySQLはリレーショナルデータベースです。

これまで見てきた通り両者の性質は根本的に異なります。同じデータベースでもここまで違うと別物といえるでしょう。

特に大きな違いとしてスキーマ設計を取り上げてみます。

MongoDBはドキュメント内の構造をある程度自由に変更できますが、MySQLではALTER TABLE文などでテーブルの全ての行に操作が必要です。

整合性の面でいえばMongoDBはドキュメントごとに異なる構造を持つことになり、MySQLのように同じデータを持っているかは分かりません。


MySQLとの連携・移行方法

MySQLとMongoDBを組み合わせてアプリケーションのパフォーマンスを向上させるアーキテクチャについて紹介します。


MySQLとの連携

MySQLから直接MongoDBを参照する試みは公式非公式問わず行われてきましたが、あまり進んでいないのが現状のようです。

連携するというよりはWebアプリケーション側で用途により使い分けるように開発を行う方が良いかもしれません。

「RDBと組み合わせる」で紹介したような適材適所への配置が無難でしょう。


MySQLへの移行方法

MongoDBからMySQLへの移行は比較的簡単になります。

実質していることはMySQLからのJSONもしくはCSV形式でのデータのエクスポートと、MongoDBへのデータのインポートです。

方法は様々・言語もバラバラですが、この点さえ分かっていれば迷うことはないと思います。


MySQLからの移行方法

MySQLからMongoDBへの移行はスキーマ設計によってはかなり大変になる可能性があるでしょう。

結論からいえば移行スクリプトを書かなければいけません。

動的スキーマ設計は開発スピードを上げるには良いのですが、落ち着いてきたらある程度のレベルのスキーマ定義は必要です。

コレクション内のドキュメントの差異が顕著な場合、また法則性が見い出せない場合はスキーマの設計から始めなければなりません。

これにはMongoDBに格納されているデータが必要か不要か、データ形式はこれで正しいかなどの確認作業も含まれます。


おわりに

MongoDBの基本的な使い方は把握できたでしょうか。

MongoDB・MySQL間のデータベース移行は可能ではありますが、なるべく技術選定時に各々の適正と用途を見極めて使用したいものです。

MongoDBを利用している企業・システムは多く、案件数もそれなりに充実しています。

またMongoDBをはじめとするNoSQLデータベースは人工知能やビッグデータなどの分野に需要があり、将来性の高い技術だといえるでしょう。


toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。

エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。