MongoDB は、オープンソースの NoSQL データベースです。リレーショナル・データベースではないため、構造化データ、半構造化データ、非構造化データを処理できます。非リレーショナルなドキュメント指向のデータモデルを基にしており、非構造化クエリ言語を使用しています。
MongoDB は柔軟性が高く、複数の種類のデータを組み合わせて保存することが可能です。また、従来のリレーショナル・データベースよりも大量のデータの保存と処理ができます。MongoDB は BSON と呼ばれるドキュメント保存形式を用いています。BSON は JSON(JavaScript Object Notation)のバイナリ版で、より多くのデータ型に対応しています。
MongoDB の仕組み
MongoDB はデータ・オブジェクトを、従来のリレーショナル・データベースで使用されているテーブルと行ではなく、コレクションとドキュメントとして扱います。コレクションはドキュメントの集合で構成されていますが、これがリレーショナル・データベースのテーブルに相当します。ドキュメントはキーと値のペアで構成されており、これが MongoDB のデータの基本単位になります。
ドキュメント構造は、新たなフィールドを追加したり、既存のフィールドを削除したりするだけで変更できます。ドキュメントの一意の識別子としてプライマリ・キーを定義できます。値には他のドキュメント、配列、ドキュメント配列など、さまざまな種類のデータ型を指定できます。
MongoDB の全文検索の仕組み
MongoDB の主な特長の 1 つに、特定のテキストや単語を文字列フィールドから検索できる全文検索があります。全文検索は、テキスト・インデックスか、$text 演算子を使用して実行します。
テキスト・インデックスは 1 つの文字列でも、文字列要素の配列でも作成できます。全文検索クエリを実行するには、コレクションにテキスト・インデックスが含まれている必要があります。コレクションに設定できるテキスト・インデックスは 1 つのみです。1 つのテキスト・インデックスを複数のフィールドに適用できます。
テキスト・インデックスを持つコレクションは、$text 演算子による検索もできます。$text 演算子は各検索文字列を空白を用いてトークン化し、– と \ 以外の全ての記号を区切り記号として扱います。検索文字列がトークン化されると、演算子はトークンに対して OR 演算を実行します。
MongoDB の 3 つのクエリ例
MongoDB は MongoDB クエリ言語(MQL)を用いて、データベースからデータを取得します。使い方は簡単で、 SQL と同様にドキュメントの作成、参照、更新、削除の CRUD 操作を実行できます。関数名は次の構文で記述します。
<database>.<collection_name>. <operation>.
以下は、実際に使用される構文の 3 つの例です。
INSERT(挿入):コレクションに新たなドキュメントを作成あるいは挿入します。コレクションが存在しない場合は、新しいコレクションが作成されます。
db.collection.insertOne() は、コレクションに 1 つのドキュメントを挿入します。
db.collection.insertMany() は、一度に複数のドキュメントをコレクションに挿入します。
「customer」というコレクションに 1 つのドキュメントを挿入すると以下のようになります。
db.customer.insertOne (
{
firstname: “Jane”,
lastname: “Mason”
Address: “232 Petunia Drive, Atlanta, GA, 30311”
}
FIND(検索):コレクション内のドキュメントを検索するクエリです。特定のドキュメントを検索するために、フィルターや条件を指定できます。
db.collection.find()
「customer」というコレクション内の全てのドキュメントを検索するには、次のコードを使用します。
db.customer.find()
UPDATE(更新):コレクション内の既存ドキュメントを変更するためのクエリです。
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
「customer」コレクション内の 1 つのドキュメントを更新するには、次のようにします。
db.customer.updateOne(
{ firstname: “Jane” },
{
$set: { “address”, “5 Lavender Ave, Atlanta, GA, 30311”}
}
)
MongoDB の 3 つの大きな特長
柔軟性
MongoDB は非構造化データと非構造化ストレージを扱う動的なスキーマ・アーキテクチャを有しています。データは JSON と似た柔軟な形式のドキュメントに保存されるため、データベース・スキーマを事前に定義する必要がなく、ダウンタイムを発生させずダイナミックにスキーマを変更できます。
MongoDB の BSON のデータ形式では、1 つのコレクション内のオブジェクトに対してさまざまなフィールド・セットの指定が可能で、ほぼ全ての種類のデータ構造をモデル化して操作できます。このため、MongoDB のデータベース・モデルは、ビジネスやデータ要件が変わっても柔軟に対応できます。
シャーディング
MongoDB はシャーディングと呼ばれるプロセスにより、水平スケーリングを実現します。シャーディングでは大規模なデータセットのデータを分割し、複数のサーバーに分散させます。1 つのサーバーで大きなデータ負荷を処理しきれない場合に、データ処理を中断することなく、負荷を自動的に分割・分散できます。
高性能
MongoDB はデータを RAM に保存することで、データ・アクセスを高速化し、クエリ実行時の性能を向上させます。ハードディスクではなく RAM から直接データを取得するため、データの読み書きが高速化しています。また、MongoDB の非リレーショナル・データべースであるため、データの検索や取得にリレーショナル・データベースほど高い処理能力を必要としません。
MongoDB に適したユースケース
リアルタイム分析
NoSQL データベースである MongoDB はビッグデータ(従来のリレーショナル・データベースでは処理しきれないほど大量かつ多様なデータ)を統合・処理するのに適しています。
MongoDB はスキーマレスであるため、さまざまなデータ型を保存し、素早くアクセスできます。また、MongoDB はビルトインでシェーディングに対応しているため、データを複数のサーバー間で水平スケーリングできます。さらに、何百ものデータソースを単一のビューに統合する際に必要な柔軟性を備えているため、リアルタイムの分析とデータ統合にも適しています。
コンテンツ管理
MongoDB の非構造化ドキュメント・モデルは、eコマース用 Web サイトやオンライン出版物、Web コンテンツ管理システムにおいて、コンテンツを管理し配信するのに最適です。柔軟なデータ・モデルにより、画像やテキスト、動画、メタデータなど、さまざまな種類のコンテンツを容易に保存できます。
関連する全てのコンテンツが 1 つのドキュメントに保存されるため、新たな機能や属性を追加するのも容易です。MongoDB はユーザーのコメントなど、分析して利用すれば将来のコンテンツ開発に有益なユーザー生成コンテンツの保存にも使用できます。
MongoDB に関する 4 つの質問と回答
MoongDB と MySQL の違いは?
MySQL は Oracle 社が管理するリレーショナル・データベース管理システム(RDBMS)です。構造化クエリ言語(SQL)を使用し、定義済みのテーブルと行でデータを表現します。MySQL で関連するテーブルからデータを取得するには、JOIN 演算子を実行する必要があります。MySQL では効果的なレプリケーションやシャーディングができません。
MongoDB は MongoDB 社が管理するオープンソースのクロス・プラットフォーム・データベースです。ドキュメントベースのデータベースで、最新のソフトウェア・アプリケーションのデータ要求に対応することを目的としています。MongoDB は クエリ言語として JavaScript を使用しており、 データは JSON ドキュメントとして表現されます。あらかじめスキーマを定義する必要がないため、同一コレクション内に異なった構造を持つドキュメントが存在できます。
MongoDB は MySQL より高速か?
MySQL は JOIN 演算子を使用して、複数のテーブルにまたがる関連データにアクセスし、クエリを実行します。データ複製を最小限に抑えられる一方で、何百万回もの読み書きが発生するため、性能に影響が生じる可能性があります。
MongoDB のドキュメント・モデルでは、関連するデータを一緒に保存するため、MySQL よりも高速でドキュメントを取得できます。マスター/スレーブ方式のレプリケーションを用いるため、MongoDB は大量の非構造化データを MySQL よりもはるかに高速に処理できます。
MySQL ではなく MongoDB を使用するべき場面は?
MongoDB か MySQL のどちらを使用するかは、具体的なユースケースやビジネスのニーズによりますが、MongoDB は以下のような点で MySQL に勝っています。
- ドキュメント指向の設計:MongoDB は NoSQL データベースであるため、データをリレーショナル形式ではなくドキュメントとして保存します。そのため、現実のビジネスの要求に、より柔軟に適応できます。対照的に、MySQL のリレーショナル・データ・スキーマはあらかじめ定義されているため、容易に変更ができず柔軟性に欠けます。
- ロード・バランシング:MongoDB はシャーディングによるロード・バランシングに対応しているため、データを水平スケーリングできます。シャーディングによりデータを分割して複数の MongoDB インスタンスとサーバーに分散させることで、性能の向上やハードウェア障害時の負荷分散を実現します。
- アドホック・クエリ:MongoDB はフィールド検索、範囲検索、正規表現を用いたアドホック・クエリをサポートしています。クエリでドキュメント内の特定のフィールドも取得できます。
どちらのデータベースが最適か:MySQL か MongoDB か?
MongoDB と MySQL は本質的に異なるデータベース管理システムですが、個々のシナリオに応じてそれぞれ利点があります。
MongoDB は企業のアプリケーション構築を高速化できるほか、さまざまな種類のデータや大量のデータを扱うのに適しています。高度なデータ有効性とスキーマの柔軟性、迅速なスケーリング能力、ビッグデータのサポートや分析ニーズに対応する能力においては MongoDB が優れています。
データ・スキーマが安定しており、非構造化データを保存する必要のない場合は MySQL が適しています。高いトランザクション・レートと参照整合性を備えた安全性を求める場合や、変更の可能性のないデータ構造を持っている場合は、MySQL を選択してください。
ピュア・ストレージでオープンソース・データベースのワークロードを高速化
自動フェイルオーバーと水平スケーリングを備えた MongoDB は、モダン・アプリケーションのために作られたオープンソースのデータベースです。MongoDB のドキュメント・データは JSON をサポートしており、オブジェクト指向言語に自然にマッピングされるため、開発をシンプルにします。MongoDB のクエリ言語は、開発者にとって学習しやすく使いやすい言語です。
ピュア・ストレージの FlashBlade でストレージをモダナイズしましょう。業界最先端のオールフラッシュ統合型高速ファイル/オブジェクト・ストレージ・ソリューションです。FlashBlade には次のような特長があります。
- アジャイル・スケールアウト・アーキテクチャ:FlashBlade は、数百億のファイルとオブジェクトの処理において最高の性能とリッチなデータ・サービスを提供します。
- シンプルなワークロード統合:FlashBlade の導入、更新、管理は、Pure1 で実施できます。
- オールフラッシュ性能:FlashBlade の高速なファイル/オブジェクト・ストレージがもたらす一貫した多次元性能により、膨大なスループットと並列性を実現します。