MongoDB を探る

このデータベース管理システムが絶大な人気を誇っている理由を学ぶ

この記事では、本番環境でデータベースをスケーリングするための機能を備え、C++ で作成されたオープンソースのドキュメント指向データベース管理システム、MongoDB について学びます。従来のリレーショナル・データベース管理システム (RDBMS) に勝る、ドキュメント指向のデータベースならではの利点を理解し、MongoDB をインストールして、データベース、コレクション、およびドキュメントの作成を始めてください。そして、キー・バリュー型ストアの効率性を RDBMS データベース管理者や開発者にお馴染みの方法でもたらす、Mongo の動的なクエリー機能を探ってください。

Joe Lennon, Lead Mobile Developer, Core International

Joe Lennon photoJoe Lennon は、アイルランドのコーク出身のソフトウェア開発者です。2007年にビジネス情報システムの学位で University College Cork を卒業した彼は、現在、Core International で Web アプリケーションと Oracle PL/SQL の開発者として働いています。



2011年 7月 22日

MongoDB とは何か

この数年、従来のリレーショナル・モデルとは異なるデータベース管理システムへの関心が次第に高まってきています。その中心にあるのは、NoSQL の概念です。NoSQL とは、SQL (Structured Query Language) を使用せずにデータベースを操作するデータベース・ソフトウェアを総称する用語です。これらのデータベース・ソフトウェアのなかでも注目に値する NoSQL のプロジェクトとしては、JSON 風のドキュメントのコレクション単位でデータを保存するオープンソースのドキュメント指向データベース、MongoDB が挙げられます。他の NoSQL データベースと比べて MongoDB を際立たせているのは、その強力なドキュメント・ベースの問い合わせ言語です。この問い合わせ言語は、リレーショナル・データベースのクエリーを MongoDB のクエリーに簡単に変換できるため、リレーショナル・データベースから MongoDB に移行するのはわけない作業です。

MongoDB は、C++ で作成されています。MongoDB は JSON 風のドキュメント (JSON のバイナリー・バージョンである BSON を使用) のなかに、キーと値のペアを使ってデータを保持します。MongoDB を他のドキュメント・データベースと差別化する 1 つの機能は、SQL ステートメントを MongoDB クエリー関数の呼び出しへと極めて容易に変換できる機能です。そのため、現在リレーショナル・データベースを使用している組織でも、簡単に MongoDB に移行することができます。さらに、主要なオペレーティング・システムおよびプログラミング言語に対応したバイナリーとドライバーを使用できるため、インストールするのも、使用するのも至って簡単です。

オープンソース・プロジェクトである MongoDB では、そのデータベース自体に GNU AGPL (Affero General Public License) バージョン 3.0 のライセンスが適用されます。GNU AGPL は GNU GPL に修正を加えたものです。GNU GPL ではコピーレフト制約がその配布にしか適用されず、ソフトウェアの使用には適用されませんでしたが、その抜け道をなくしたのが GNU AGPL です。もちろん、この修正が重要になるのは、ソフトウェアがクライアント機器にインストールされずにクラウド上に保存されているような場合です。通常の GPL を使用した場合には、配布が実際に行われることはないと気付いた誰かが、ライセンス条件を巧みに逃れる可能性があります。

AGPL はデータベース・アプリケーション自体にのみ適用され、MongoDB を構成するその他の要素には適用されません。開発者が各種のプログラミング言語から MongoDB に接続するために使用できる公式ドライバーは、Apache License Version 2.0 の下で配布されます。MongoDB のマニュアルは、クリエイティブ・コモンズ・ライセンス (CC ライセンス) の下で利用することができます。

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

ドキュメント指向データベースと従来のリレーショナル・データベースには、かなりの違いがあります。ドキュメント指向データベースでは、テーブルのような杓子定規の構造にデータを保存するのではなく、緩やかに定義されたドキュメントにデータを保存します。テーブルに新しい列を追加する場合、リレーショナル・データベース管理システム (RDBMS) では、その新しい列を既存のすべてのレコードに (値が null であるとしても) 追加するために、テーブル自体の定義を変更する必要があります。これは、RDBMS のスキーマをベースとした厳格な設計によるものです。一方、ドキュメントを使用する場合には、新しい属性を個々のドキュメントに追加するだけでよく、他のドキュメントを変更する必要はありません。ドキュメント指向データベースは基本的に、スキーマを使わないためです (スキーマレスな設計)。

もう 1 つの根本的な違いは、ドキュメント指向データベースではスキーマレスな設計を維持できるように、ドキュメント間の厳密な関係を定義しないことです。この点は、リレーショナル・データベースとは著しく異なります。リレーショナル・データベースは、関係 (リレーション) を大々的に利用して、保存されるデータを正規化します。ドキュメント指向データベースでは、「関係のある」データを個別のストレージ域に保存する代わりに、ドキュメント自体にそのデータを埋め込みます。関係のあるデータを別のドキュメントに保存し、そのドキュメントへの参照を保存するとなると、その参照ごとに追加のクエリーが必要になります。したがって、関係のあるデータをドキュメント自体に埋め込んだほうが、処理に要する時間を遥かに短縮できるというわけです。

この仕組みは、必要なデータを親ドキュメント内に完全に埋め込むことが妥当な多くのアプリケーションで極めて有効に機能します。その好例 (MongoDB のマニュアルでも取り上げられています) は、ブログの投稿とコメントです。コメントは 1 つの投稿にしか適用されないため、コメントを該当する投稿と切り離すのでは意味がありません。MongoDB では、ブログ投稿ドキュメントに scomments 属性を設定し、この属性に投稿のコメントを保存します。リレーショナル・データベースを使用する場合には、それぞれ ID を主キーとした comments テーブルと posts テーブルを作成し、コメントがどの投稿に属するのかを定義する中間マッピング・テーブル post_comments を作成することになるでしょう。これでは、本来は単純であるはずのことを必要以上に複雑化するだけです。

関係のあるデータを別々に保存しなければならないとしても、MongoDB ではそれぞれに個別のコレクションを使用することで簡単に対応することができます。もう 1 つの好例として、顧客からの注文情報を MongoDB ドキュメントに保存するという例があります。このような注文情報は一般に、顧客情報、注文書本体、注文に含まれる品目、そして製品情報で構成されています。MongoDB を使用する場合、顧客情報、製品情報、注文書本体については個々のコレクションに保存しますが、品目のデータは該当する注文書ドキュメントに組み込むことになります。そして、リレーショナル・データベースでのように、products コレクションと customers コレクションを外部キーのような ID を使って参照します。このハイブリッド方式の単純さが、SQL の扱いに慣れている人にとって MongoDB が絶好の選択肢となる理由です。そうは言っても、どの手法を採用するかは、それぞれの状況に応じてじっくり時間をかけて決定してください。パフォーマンス上のメリットは、他のコレクションに含まれるデータを参照するよりも、データをドキュメント内に埋め込んだ場合のほうが顕著に現れます。

MongoDB の主な特徴

MongoDB は単なる基本的なキー・バリュー型ストアというだけではありません。以下に、その他の特徴を抜粋して簡単に紹介します。

  • Windows、Mac OS X、Linux および Solaris 対応の公式バイナリー。セルフビルド用にソース・ディストリビューションも用意されています。
  • C、C#、C++、Haskell、Java、JavaScript、Perl、PHP、Python、Ruby、および Scala 対応の公式ドライバー。この他の言語についても、コミュニティーが支援する広範なドライバーがあります。
  • アドホック JavaScript クエリー。あらゆるドキュメント属性の任意の基準を使ってデータを検索することができます。これらのクエリーは SQL クエリーの機能を反映しているため、SQL 開発者にとって MongoDB クエリーを作成するのは至って簡単です。
  • クエリー内での正規表現のサポート。
  • MongoDB クエリー結果が保存されるカーソルには、フィルタリング、集約、ソートを行うための多種多様な関数 (limit()skip()sort()count()distinct()group() など) が用意されています。
  • 高度な集約操作を実現する map/reduce 実装。
  • GridFS によるサイズの大きなファイルの保存。
  • RDBMS のような属性インデックス (属性索引) のサポート。ドキュメントの属性を選択して、その属性に直接インデックスを作成することができます。
  • ヒント、explain plan、およびプロファイリングを使用したクエリー最適化機能。
  • MySQL と同様のマスター/スレーブ・レプリケーション。
  • コレクション・ベースのオブジェクトの保存。正規化されたデータが必要な参照クエリーを可能にします。
  • 自動シャーディングによる水平スケーリング。
  • ハイパフォーマンスで競合のない並行性を実現するインプレース更新。
  • オンライン・シェルによって、MongoDB をインストールせずに試してみることができます。
  • 詳細なドキュメント。すでに出版されている本、そして現在執筆中の本も複数あります。

MongoDB のインストール

ありがたいことに、MongoDB は多種多様なプラットフォームに簡単にインストールすることができます。Windows、Mac OS X、Linux、および Solaris 用のバイナリー・ディストリビューションを入手できると同時に、その他のシステムにも、さまざまなパッケージ・マネージャーがインストールおよびセットアップのオプションを提供しています。その気になれば、ソース・コードを自分でコンパイルすることも可能です。このセクションでは、Windows と Mac OS X のそれぞれに MongoDB をインストールして、Windows 上のサービス、または OS X 上のデーモンとしてプロセスを設定する方法を説明します。

Windows にインストールする場合

Windows に MongoDB をインストールするのはとても簡単です。お好みの Web ブラウザーで http://www.mongodb.org/downloads にアクセスして、Windows 対応の最新の安定製品版リリースをダウンロードします。推奨されているのは 64 ビット版ですが、これを使用できるのは 64 ビットの Windows オペレーティング・システムを使用している場合のみです。確かでない場合には、32 ビット版を使用してください。

zip ファイルを C:\ ドライブに解凍すると、mongodb-win32-i386-1.6.4 というような名前の新規フォルダーが作成されます。作業を楽にするために、このフォルダーの名前を mongo に変更してください。次に必要なのは、データ・ディレクトリーを作成することです。Windows エクスプローラーで C:\ ドライブのルートに移動して、data という名前のフォルダーを新しく作成します。さらにこのフォルダー内に、db という新規フォルダーを作成します。

これで、MongoDB サーバーを起動できる状態になりました。Windows エクスプローラーを使用して C:\mongo\bin にナビゲートし、mongod.exe をダブルクリックします。この操作によって、コマンド・プロンプト・ウィンドウが開きます。このウィンドウを閉じると、MongoDB サーバーは停止します。以上のような方法でインストールすることもできますが、それよりも便利な方法は MongoDB サーバーを Windows が制御するサービスとしてセットアップする方法です。その手順は以下のとおりです。

コマンド・プロンプト・ウィンドウを開き (「スタート」 > 「ファイル名を指定して実行」の順に選択し、cmd と入力して「OK」をクリックします)、リスト 1 のコマンドを実行します。

リスト 1. MongoDB サーバーをサービスとしてセットアップする
> cd \mongo\bin
> mongod --install --logpath c:\mongo\logs --logappend 
--bind_ip 127.0.0.1 --directoryperdb

リスト 2 の出力が表示されます。

リスト 2. 正常に作成されたサービス
all output going to c:\mongo\logs
Creating service MongoDB.
Service creation successful.
Service can be started from the command line via 'net start "MongoDB"'.

Mongo がサービスとしてインストールされていれば、コマンド > net start "MongoDB" を実行することで MongoDB サーバーを起動することができます。

リスト 3 の出力が表示されます。

リスト 3. 正常に起動した Mongo
The Mongo DB service is starting.
The Mongo DB service was started successfully.

これで、MongoDB シェル・クライアントを実行することができます。コマンド・プロンプト・ウィンドウが開いている場合は、カレント・ディレクトリーが C:\mongo\bin フォルダーであることを確認してから、コマンド > mongo を実行します。

あるいは、Windows エクスプローラーで C:\mongo\bin にナビゲートし、mongo.exe をダブルクリックするという方法もあります。どちらの方法でシェルを起動したとしても、リスト 4 のプロンプトが表示されるはずです。

リスト 4. シェルを起動する
MongoDB shell version: 1.8.1
connecting to: test
>

Mac OS X マシンにも MongoDB をセットアップしたいというのでなければ、このセクションの次のパートを読み飛ばして「MongoDB の使用方法」のセクションに進んでも構いません。そこから早速、シェル・クライアントを使って MongoDB サーバーを操作する方法を学べます。

Mac OS X にインストールする場合

以下の手順では、64 ビット版の Mac OS X を使用しているという前提で、MongoDB の64 ビット OS X バイナリーをダウンロードして解凍し、MongoDB が起動するように構成する方法を詳しく説明します。さらに、MongoDB をデーモンとして実行する方法も説明します。

まず、ターミナルを起動します (「アプリケーション」 > 「ユーティリティー」 > 「ターミナル」)。ターミナル・ウィンドウで、リスト 5 に記載するコマンドを実行します。

リスト 5. Mac OS X に MongoDB をセットアップする
$ cd ~
$ curl http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-1.6.4.tgz > mongo.tgz
$ tar xzf mongo.tgz
$ mv mongodb-osx-x86_64-1.8.1/ mongo
$ mkdir -p /data/db

これで、MongoDB がセットアップされて使用できる状態になります。手順を進める前に、MongoDB をパスに追加しておくと便利です。それには、コマンド $ nano ~/.bash_profile を実行します。

このファイルはまだ存在していない場合もありますが、いずれにしても、このファイルに行 export PATH={$PATH}:~/mongo/bin を追加してください。

ファイルを保存するために Ctrl + O を押し、プロンプトが出されたら Enter を押します。その後、Ctrl + X を押して nano を終了したら、コマンド $ source ~/.bash_profile を実行して bash プロファイルをリロードします。

これで MongoDB を起動する準備ができました。MongoDB を起動するには、単にコマンド $ mongod を実行するだけです。

このコマンドを実行すると、MongoDB データベース・サーバーがフォアグラウンド・プロセスとして起動されます。MongoDB をデーモン・プロセスとしてバックグラウンドで起動する場合には、代わりにコマンド $ sudo mongod --fork --logpath /var/log/mongodb.log –logappend を実行してください。

パスワードの入力を求めるプロンプトが表示されたら、Mac OS X 管理者パスワードを入力します。

どちらの方法で MongoDB を起動するにしても、サーバーは現在稼働中の状態になっています。フォアグラウンドで起動した場合には、クライアントを起動するために別のターミナル・タブまたはターミナル・ウィンドウが必要です。クライアントを起動するには、単にコマンド $ mongo を実行します。

リスト 6 の出力が表示されます。

リスト 6. クライアントを起動する
MongoDB shell version: 1.8.1
connecting to: test
>

次のセクションでは、MongoDB シェルを使用してデータベース、コレクション、ドキュメントなどを作成する方法を説明します。


MongoDB の使用方法

MongoDB ディストリビューションには、データベースを完全に制御できるシェル・アプリケーションが含まれています。このシェルでは、サーバー・サイドの JavaScript 関数を使用してデータベース、コレクション、ドキュメント、インデックスを作成および管理できるため、MongoDB をすんなり使いこなせるようになっています。このセクションでは、シェルの起動方法を説明した後、データを保存および取得するための基本的なコマンドの例をいくつか紹介します。

MongoDB シェル

MongoDB シェル・アプリケーションは、MongoDB ディストリビューションの bin フォルダー内にあります。Windows では、このアプリケーションは mongo.exe という形になっていて、Windows エクスプローラーでこのプログラムをダブルクリックすることでシェルが起動します。UNIX ベースのオペレーティング・システム (Mac OS X を含む) で MongoDB シェルを起動するには、ターミナル・ウィンドウで mongo コマンドを実行します (前のセクションの手順に従って、MongoDB ディレクトリーをパスに追加してあることが前提です)。

初めてシェルを起動すると、リスト 7 のメッセージが表示されます。

リスト 7. シェル起動後のメッセージ
MongoDB shell version: 1.8.1
connecting to: test
>

これで、ローカル MongoDB サーバーに接続している状態になりました。具体的な接続先は、test データベースです。次のセクションでは、データベース、ドキュメント、およびコレクションの作成方法を説明します。ヘルプが必要になった場合には随時、Mongo シェル・プロンプトに対して help コマンドを実行してください。すると、ヘルプを表示することができます。図 1 に、help コマンドの標準的な出力を示します。

図 1. Mongo シェルの help コマンドによる出力
Mongo シェルの help コマンドによる出力

MongoDB 関数のソース・コードを確認したいと思ったら、シェルでその関数の名前を入力するだけで、JavaScript ソースが出力されます。例えば、connect と入力してリターン・キーを押すと、MongoDB データベースに接続するために使用されるソース・コードが表示されます。

データベース、コレクション、ドキュメントを作成する

デフォルトでは、Mongo シェルは test データベースに接続します。別のデータベースに切り替えるには、use dbname コマンドを使用します。切り替え先のデータベースが存在しない場合、MongoDB はユーザーがデータを追加すると同時にそのデータベースを作成します。試しに、mymongo というデータベースに切り替えるために、コマンド > use mymongo を実行してください。

シェルは、データベースへの切り替えが完了したことを示す switched to db mymongo というメッセージを返します。

現時点では、このデータベースは実際に存在していません。データベースに保存されているデータは何もないからです。MongoDB では、必要に応じてドキュメントを区分できるように、コレクション内にデータが保存されます。そこで、新しいドキュメントを作成し、そのドキュメントを colors という新しいコレクションに保存してみましょう。そのためには、コマンド > db.colors.save({name:"red",value:"FF0000"}); を実行してください。

ドキュメントが保存されたことを確認するには、> db.colors.find(); を実行することにより、データベースに対してクエリーを実行します。

すると、次のような応答が表示されるはずです (_id 属性は一意の ID なので、皆さんの結果とここに示す _id 属性の値は異なるはずです): { "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "red", "value" : "FF0000" }.

MongoDB 内部では、ドキュメントは BSON (Binary JSON) として保存されます。Mongo シェルを使用すれば、JSON のような構文を使ってデータを挿入することができます。この構文では、それぞれのドキュメントがキーと値のペアからなる 1 つのオブジェクトとなります。この例の場合、作成したドキュメントには、namevalue という 2 つの属性があり、これらの属性の値はそれぞれ redFF0000 (標準的な赤色の 16 進表現) となっています。

お気付きかもしれませんが、colors コレクションを事前に定義する必要はありませんでした。コレクションは、save 関数を使って項目を挿入すると、自動的に定義されます。

この例で作成したのは極めて単純なドキュメントですが、ここで使用している JSON 風の構文を使用すれば、これよりもっと複雑なドキュメントでも作成することができます。JSON ドキュメントの一例として、以下に注文書または請求書を表すドキュメントを記載します (リスト 8 を参照)。

リスト 8. 単純なドキュメントを作成する
{
    order_id: 109384,
    order_date: new Date("12/04/2010"),
    customer: {
        name: "Joe Bloggs",
        company: "XYZ Inc.",
        phone: "(555) 123-4567"
    },
    payment: {
        type: "Cash",
        amount: 4075.99,
        paid_in_full: true
    },
    items: [
        {
            sku: "ABC1200",
            description: "A sample product",
            quantity: 1,
            price_per_unit: 75.99,
        }, {
            sku: "XYZ3400",
            description: "An expensive product",
            quantity: 2,
            price_per_unit: 2000
        }
    ],
    cashier_id: 340582242
}

ご覧のように、これらのドキュメントにはさまざまなデータ型 (ストリング型、整数型、浮動小数点型、日付型、オブジェクト型、配列型など) を保存することができます。リスト 8 では、注文対象の品目が注文ドキュメントに直接埋め込まれていることから、後ほどドキュメント上でクエリーを実行する際に、この情報をより素早く取得することができます。

MongoDB シェルは JavaScript を使用するため、データベースを操作するときには通常の JavaScript の構成体を使用することができます。例えばリスト 9 は、それぞれに文字とその文字に対応する ASCII コードのストリング表現が含まれる、文字ドキュメントのコレクションを作成しています。

リスト 9. 文字ドキュメントのコレクションを作成する
> var chars = "abcdefghijklmnopqrstuvwxyz"
> for(var i =0; i<chars.length; i++) {    
... var char = chars.substr(i, 1);          
... var doc = {char:char, code: char.charCodeAt(0)};
... db.alphabet.save(doc);
... }

上記のループによって、26 個のドキュメントが作成されます。それぞれのドキュメントはアルファベットの小文字 1 文字に対応し、ドキュメントごとに、アルファベットの文字とその ASCII 文字コードが含まれます。次のセクションでは、このデータを取得するさまざまな方法を紹介します。

データを取得する

前のセクションで学んだのは、MongoDB データベースにデータを挿入する方法だけではありません。実は、データを取得するための最も基本的な関数、find の使い方も学びました。まずは、この find コマンドを前のセクションの終わりで作成した alphabet コレクションで実行してみましょう。db.alphabet.find(); を実行してください。

このコマンドを実行すると、リスト 10 のような応答が生成されます。

リスト 10. 生成された応答
> db.alphabet.find()
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8c"), "char" : "a", "code" : 97 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8d"), "char" : "b", "code" : 98 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8e"), "char" : "c", "code" : 99 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8f"), "char" : "d", "code" : 100 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec90"), "char" : "e", "code" : 101 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec91"), "char" : "f", "code" : 102 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec92"), "char" : "g", "code" : 103 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec93"), "char" : "h", "code" : 104 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec94"), "char" : "i", "code" : 105 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec95"), "char" : "j", "code" : 106 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec96"), "char" : "k", "code" : 107 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec97"), "char" : "l", "code" : 108 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec98"), "char" : "m", "code" : 109 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec99"), "char" : "n", "code" : 110 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec9a"), "char" : "o", "code" : 111 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec9b"), "char" : "p", "code" : 112 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec9c"), "char" : "q", "code" : 113 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec9d"), "char" : "r", "code" : 114 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec9e"), "char" : "s", "code" : 115 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec9f"), "char" : "t", "code" : 116 }
has more
>

デフォルトでは、find() 関数はコレクションに含まれるすべてのドキュメントを取得しますが、表示するのは最初の 20 個のドキュメントだけです。残りの 6 個のドキュメントを表示するには、it コマンドを実行します (リスト 11 を参照)。

リスト 11. 残りの 6 個のドキュメントを表示する
> it
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca0"), "char" : "u", "code" : 117 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca1"), "char" : "v", "code" : 118 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca2"), "char" : "w", "code" : 119 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca3"), "char" : "x", "code" : 120 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca4"), "char" : "y", "code" : 121 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca5"), "char" : "z", "code" : 122 }
>

find() 関数は、実際にはクエリーの結果セットにカーソルを返します。この例ではすべてのドキュメントが取得されます。カーソルが変数に割り当てられていなかったり、他の関数が実行されなかったりする場合には、この関数はデフォルトで結果セットの一例を画面に出力します。結果セットをすべて表示するには、コマンド > db.alphabet.find().forEach(printjson); を使用することもできます。

上記のコマンドを実行した場合には、結果セットのサブセットではなく、そこに含まれるすべてのレコードが出力されます。次は、カーソルとクエリーを使用してデータをフィルタリングする方法について詳しく説明します。


データに対するクエリー

MongoDB の最強の利点の 1 つは、その強力なアドホック・クエリーのサポートです。MongoDB のアドホック・クエリーは従来のリレーショナル・データベースとほぼ同様に機能しますが、クエリーが返すのはテーブルの行ではありません。MongoDB のクエリーは、BSON ドキュメントをフィルタリングして返します。この手法が、SQL 開発者にとって理解しにくい他のドキュメント・ストアから MongoDB を分け隔てている点です。MongoDB では、比較的複雑な SQL クエリーでも簡単に JavaScript 関数の呼び出しに変換することができます。このセクションでは、MongoDB に保存されたデータに対してクエリーを実行するときに使用できる多種多様な関数について説明するとともに、DB2 や MySQL、Oracle でのインデックス (索引) と同じように、クエリーの最適化に役立つインデックスをセットアップする方法を説明します。

基本的なクエリー

前のセクションでは、find 関数を使ってすべてのドキュメントを取得する方法を説明しましたが、find 関数は、返される結果をフィルタリングするための一連の引数を受け付けます。例えば、前に作成した alphabet コレクションで char 属性の値が o となっているすべてのレコードを見つけたいとします。それには、コマンド > db.alphabet.find({char: "o"}); を使用します。

これによって返される応答は次のとおりです: { "_id" : ObjectId("4cfa4adf528bad4e29beec9a"), "char" : "o", "code" : 111 }.

100 以下のコードを持つすべての文字を返すとしたら、コマンド > db.alphabet.find({code:{$lte:100}}); を実行します。

このコマンドによって返されるのはもちろん、リスト 12 の結果です。

リスト 12. 結果
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8c"), "char" : "a", "code" : 97 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8d"), "char" : "b", "code" : 98 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8e"), "char" : "c", "code" : 99 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8f"), "char" : "d", "code" : 100 }

MongoDB は、以下に挙げるようなさまざまな条件演算子をサポートします。

  • $lt (より小さい)
  • $lte (以下)
  • $gt (より大きい)
  • $gte (以上)
  • $all (配列に含まれるすべての値と一致)
  • $exists (フィールドの有無をチェック)
  • $mod (モジュロー)
  • $ne (等しくない)
  • $in (配列に含まれる 1 つ以上の値と一致)
  • $nin (配列に含まれるどの値とも不一致)
  • $or (どちらかのクエリーと一致)
  • $nor (どちらのクエリーとも不一致)
  • $size (定義された数の要素を持つ配列と一致)
  • $type (指定された BSON データ型を持つ値と一致)
  • $not (等しくない)

これらの演算子についての詳細は、MongoDB のマニュアルを参照してください (「参考文献」にリンクが記載されています)。

find 関数で 2 つ目の引数を指定することによって、クエリーから返されるフィールドを制限することができます。例えば、クエリーでコード値が 102 から 105 までのドキュメントの char 属性だけを取得するには、> db.alphabet.find({code:{$in:[102,103,104,105]}}, {char: 1}); を実行します。

これによって、リスト 13 の結果が生成されます。

リスト 13. 結果
{ "_id" : ObjectId("4cfa4adf528bad4e29beec91"), "char" : "f" }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec92"), "char" : "g" }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec93"), "char" : "h" }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec94"), "char" : "i" }

次のセクションでは、クエリーを高速化するためのインデックスを作成する方法を説明します。

インデックスの作成

MongoDB のインデックスは、リレーショナル・データベースのインデックス (索引) にかなり似ています。任意の属性にインデックスを付けられるだけでなく、インデックスを付けるフィールドのデータ型は、オブジェクト型や配列型を含め、どの型にでもすることができます。RDBMS のインデックスと同様に、複数の属性を使って複合インデックスを作成することも、重複する値が許可されないように、一意のインデックスを作成することもできます。

基本的なインデックスを作成するには、ensureIndex 関数を使用します。一例として、alphabet コレクションの code 属性と char 属性にインデックスを作成してみます (リスト 14 を参照)。

リスト 14. インデックスを作成する
> db.alphabet.ensureIndex({code: 1});
> db.alphabet.ensureIndex({char: 1});

インデックスを破棄するには、dropIndex 関数と dropIndexes 関数を使用することができます。詳細については、MongoDB のマニュアルを参照してください。

ソート

結果セットをソートするには、カーソルに sort 関数を適用します。alphabet コレクションはすでに code 属性と char 属性の両方を基準に昇順にソートされているので、code 属性を基準に降順でソートしたコレクションのサブセットを取得してみましょう。> db.alphabet.find({code: {$gte: 118}}).sort({code: 0}); を実行してください。

すると、リスト 15 の結果が返ってきます。

リスト 15. 結果
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca5"), "char" : "z", "code" : 122 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca4"), "char" : "y", "code" : 121 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca3"), "char" : "x", "code" : 120 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca2"), "char" : "w", "code" : 119 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beeca1"), "char" : "v", "code" : 118 }

上記のコマンドで引数 {code: 1} を sort 関数に指定すると、結果セットは昇順でソートされます。ハイパフォーマンスのクエリーにするためには、データをソートする際に使用する任意の属性に必ずインデックスを追加してください。


skip および limit を使用した結果の構文解析

データの結果セットを扱う際に、結果のサブセットを順々に取得しなければならない場合はよくあります。例えばページ番号を付けた結果を Web ページに表示するといった場合です。MySQL でこの操作を行うとしたら、通常は LIMIT キーワードを使用します。MongoDB でこの機能を再現するのは簡単です。それには、skip 関数と limit 関数を使用します。例えば、alphabet コレクションの最初の 5 個のドキュメントを返すには、> db.alphabet.find().limit(5); を実行します。

これによって、リスト 16 の結果が返ってきます。

リスト 16. 結果
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8c"), "char" : "a", "code" : 97 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8d"), "char" : "b", "code" : 98 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8e"), "char" : "c", "code" : 99 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec8f"), "char" : "d", "code" : 100 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec90"), "char" : "e", "code" : 101 }

次のページを取得するには、コマンド > db.alphabet.find().skip(5).limit(5); を実行します。

リスト 17 のとおり、このコマンドによって次の 5 つのレコードが取得されます。

リスト 17. 次の 5 つのレコードを取得する
{ "_id" : ObjectId("4cfa4adf528bad4e29beec91"), "char" : "f", "code" : 102 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec92"), "char" : "g", "code" : 103 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec93"), "char" : "h", "code" : 104 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec94"), "char" : "i", "code" : 105 }
{ "_id" : ObjectId("4cfa4adf528bad4e29beec95"), "char" : "j", "code" : 106 }

グループ化関数と集約

MongoDB のクエリー・エンジンもまた、集約およびグループ化関数を極めて簡単にデータに適用できるようにしています。これらの集約とグループ化は、SQL の集約、グループ化と似ています。最も広く使用されている関数は、ほぼ間違いなく count() 関数です。例えば、> db.alphabet.find().count(); を実行してみてください。

上記のコマンドによって、26 が返されます。フィルタリングしたクエリーをカウントするのも簡単です。その場合には、> db.alphabet.find({code: {$gte: 105}}).count(); といったステートメントになります。

上記のステートメントによって、18 が返されます。

有用な集約関数としては、distinct もあります。この関数は、1 つの属性が取り得る値のセットとして、異なる値のセットを返す場合に使用します。alphabet コレクションに含まれるデータはすべて一意に決まるデータなので、例として使用するには向きません。そこで、前に作成した colors コレクションにレコードを 2 つ追加して、この関数を説明するために使用することにします (リスト 18 を参照)。

リスト 18. color コレクションにレコードを追加する
> db.colors.save({name:"white",value:"FFFFFF"});
> db.colors.save({name:"red",value:"FF0000"});  
> db.colors.find();

colors コレクションを削除していなければ、リスト 19 の応答が表示されます。

リスト 19. 応答
{ "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "red", "value" : "FF0000" }
{ "_id" : ObjectId("4cfa5830528bad4e29beeca8"), "name" : "white", "value" : "FFFFFF" }
{ "_id" : ObjectId("4cfa5839528bad4e29beeca9"), "name" : "red", "value" : "FF0000" }

ご覧のように、このコレクションには明らかに red ドキュメントが 2 個含まれています。ここで、distinct 関数を使用して、このコレクションから 1 つの name 属性の値のセットを取得します。そのためのコマンドは、> db.colors.distinct("name"); です。

これによって、[ "red", "white" ] という応答が返されます。

注意する点として、distinct 関数は他のクエリー関数のようにカーソルや結果セットに対して実行するのではなく、コレクションで直接実行します。また、この関数はドキュメントのセットを返すのではなく、値の配列を返すという点にも注意してください。

MongoDB には、SQL では GROUP BY 式で実行するようなアクションを実行する group 関数もあります。group 関数はかなり複雑な関数なので、ここでは簡単な例を紹介するだけにとどめておきます。例えば、name 属性の値でグループ化したドキュメントの数をカウントしたいとします。SQLでは、SELECT name, COUNT(*) FROM colors GROUP BY name; というクエリーを定義することになります。

MongoDB の場合、このクエリーを実行するにはリスト 20 に記載するコマンドを使用します。

リスト 20. group 関数を使用する
> db.colors.group(
... {key: {name: true},
... cond: {},
... initial: {count: 0},                                  
... reduce: function(doc, out) { out.count++; }
... });

このコマンドの実行結果は、リスト 21 のとおりです。

リスト 21. 結果
[
    {
        "name" : "red",
        "count" : 2
    },
    {
        "name" : "white",
        "count" : 1
    }
]

高度な集約を実行しなければならない場合や、大規模なデータ・セットを使用しなければならない場合にも対処できるように、MongoDB には map/reduce の実装も組み込まれています。上記で概説した group 関数はシャーディングを使用した MongoDB のセットアップでは機能しないので、その場合には必ず map/reduce を使用してください。

既存のデータを更新する

MongoDB シェルでドキュメントを更新するのは至って簡単です。前に作成した colors コレクションには、red のレコードを 2 つ含めました。この 2 つのレコードのうちの 1 つを取得し、value 属性を 000000 (黒の 16 進数値) に設定して black のレコードに変更したいとします。それにはまず、findOne 関数を使って値が red に設定された単一の項目を取得し、そのプロパティーを必要に応じて変更してから、ドキュメントをデータベースに保存するという方法を用います。

名前が red の単一のドキュメントを取得して、blackDoc 変数に保存するには、> var blackDoc = db.colors.findOne({name: "red"}); を実行します。

次に、ドット表記を使用して、ドキュメントのプロパティーを変更します (リスト 22 を参照)。

リスト 22. ドキュメントのプロパティーを変更する
> blackDoc.name = "black";
> blackDoc.value = "000000";

保存する前に、ドキュメントの内容が正しいことを確認します (ドキュメントには、_id 属性がなければなりません。そうでないと、red のドキュメントが上書き保存される代わりに、新しいレコードが挿入されてしまいます)。それには、> printjson(blackDoc); を実行します。

このコマンドによってリスト 23 のような結果が返されたら、次の操作に進んでください。

リスト 23. 結果
{
    "_id" : ObjectId("4cfa43ff528bad4e29beec57"),
    "name" : "black",
    "value" : "000000"
}

最後に、save 関数を使用して、ドキュメントをデータベース内の colors コレクションに保存します。そのためのコマンドは、> db.colors.distinct("name"); です。

これで、find 関数を使用してコレクションの内容が正しいことを確認することができます。> db.colors.find(); を実行してください。

リスト 24 のような結果が返されるはずです。コレクションに 4 つのレコードがある場合には、操作を誤っていることになります。

リスト 24. 結果
{ "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "black", "value" : "000000" }
{ "_id" : ObjectId("4cfa5830528bad4e29beeca8"), "name" : "white", "value" : "FFFFFF" }
{ "_id" : ObjectId("4cfa5839528bad4e29beeca9"), "name" : "red", "value" : "FF0000" }

Mongo シェル外部では、アプリケーションで update 関数を使用して変更内容を既存のデータに適用します。update 関数についての詳細は、MongoDB のマニュアルを参照してください。

データを削除する

MongoDB に保存されているデータを削除するには、remove 関数を使用します。この関数は MongoDB シェル・プログラムに適用されることに注意してください。ドライバーによっては、delete 関数やその他の関数を実装している場合もあります。特定の実装については、ドキュメントを確認してください。

remove 関数は find 関数と同じように機能します。例えば、colors コレクションから名前が white のドキュメントを削除するには、コマンド > db.colors.remove({name:"white"}); を実行します。

その後、> db.colors.find(); を実行すれば、ドキュメントが削除されていることを確認することができます。

すべてが上手く行っていれば、ドキュメントが 2 個だけ表示されます (リスト 25 を参照)。

リスト 25. データを削除する
{ "_id" : ObjectId("4cfa43ff528bad4e29beec57"), "name" : "black", "value" : "000000" }
{ "_id" : ObjectId("4cfa5839528bad4e29beeca9"), "name" : "red", "value" : "FF0000" }

コレクションからすべてのドキュメントを削除する場合には、単に > db.colors.remove(); のように、コマンドのフィルターを省略します。

上記のコマンドを実行した後に、find 関数を実行してみてください。> db.colors.find(); からは、何も応答がないはずです。これは、結果セットが空であることを意味します。

変数にドキュメントを保存している場合には、そのドキュメントを remove 関数に渡して削除することもできますが、それでは効率的ではありません。それよりも便利な方法は、該当するドキュメントの _id 属性を検索し、見つかった属性を remove 関数に渡すことです。

コレクションを破棄するには、コマンド > db.colors.drop(); を使用します。

このコマンドを実行すると、true が返されます。

その後に show collections コマンドを実行すれば、コレクションが確実に破棄されたことを確認することができます。このコマンドは、リスト 26 の出力を生成するはずです。

リスト 26. show collections コマンドを実行する command
alphabet
system.indexes

最後に、データベース全体を削除するとしたら、コマンド > db.dropDatabase(); を実行します。

このコマンドによって、現在選択されているデータベースが削除され、{ "dropped" : "mymongo", "ok" : 1 } という出力が表示されます。

コマンド show dbs を実行すると、使用可能なデータベースの一覧を取得することができます。この一覧に、mymongo は含まれていないはずです。


ツールおよびその他の機能

MongoDB には、データベースを管理する際に役立つ一連のユーティリティーが組み込まれています。これらのユーティリティーは、レポート作成やバックアップを目的にデータをインポートおよびエクスポートするさまざまな手段を提供します。このセクションでは、ファイルを JSON フォーマットでインポートおよびエクスポートする方法、そしてリカバリーの際により効率的に機能するホット・バックアップ・ファイルを作成する方法を説明します。さらに、Mongo の通常のクエリー関数の代わりに map/reduce 関数を使用することで、データの集約が複雑な場合にも対応できることを説明します。

データをインポート/エクスポートする

MongoDB の bin ディレクトリーには、さまざまなフォーマットでデータをインポー/エクスポートできるユーティリティー一式が保存されています。例えば mongoimport ユーティリティーでは、各行に JSON、CSV、または TSV フォーマットのドキュメントが含まれるファイルを指定して、これらのドキュメントを個々に MongoDB データベースに挿入することができます。MongoDB は BSON を使用するため、JSON ドキュメントをインポートする場合、通常の JSON にはない BSON で追加されたデータ型を利用したいと思ったら、修飾子情報を追加で提供する必要があります。

mongoexport ユーティリティーでは、MongoDBデータベース内のあらゆるドキュメントを JSON または CSV フォーマットで表したファイル出力を生成することができます。アプリケーションが JSON または CSV データを入力として受け入れる場合、レポートを生成するにはこのユーティリティーが役立ちます。CSV ファイルを生成する場合には、出力ファイルに含まれる順番でフィールドを指定する必要があります。

データベースをバックアップ/リストアする

mongoimport ユーティリティーや mongoexport ユーティリティーは、MongoDB のデータを他のアプリケーションで使用するために取得したり、他のアプリケーションからデータをインポートして JSON または CSV データを使用できるようにしたりする場合には役立ちます。けれども、MongoDB データベースの定期的なバックアップを取る場合や、MongoDB データベースをリストアする場合には、これらのユーティリティーを使用しないでください。MongoDB が使用するのは JSON でも、CSV でもなく、BSON であるため、これらのフォーマットでデータをインポートする際に、データ型を維持するのが困難だからです。

適切なバックアップとリストアの機能を提供するために、MongoDB では 2 つのユーティリティー、mongodump と mongorestore を用意しています。mongodump はデータベースのバックアップ・ファイルをバイナリー・ファイルとして生成するユーティリティーです。mongorestore ユーティリティーはこのファイルを読み込んでデータベースをリストアし、必要に応じて自動的にインデックスを作成します (バックアップ・ディレクトリーから system.indexes.bson ファイルが削除されている場合には、その限りではありません)。


管理ユーティリティー

MongoDB は、Web ベースの診断インターフェースも提供しています。デフォルトの MongoDB 構成では、このインターフェースには http://localhost:28017/ でアクセスすることができます。すると、図 2 のスクリーン・ショットのような画面が表示されます。

図 2. MongoDB の診断
MongoDB の診断

他の管理情報を取得するには、MongoDB シェルで以下のコマンドを実行します。

  • db.serverStatus();
  • db.stats();

MongoDB サーバーがクラッシュした場合には、データベースを修復して破損がないかどうかを調べ、何らかのデータ・コンパクションを行わなければなりません。修復を行うには、OS のコマンドラインで mongod --repair を実行するか、MongoDB シェルから db.repairDatabase(); コマンドを実行します。後者のコマンドが動作するのはデータベース単位なので、サーバー上にあるデータベースごとに実行する必要があります。

validate 関数を使用して、コレクション・データを検証することもできます。contacts という名前のコレクションがあるとしたら、このコレクションを検証するためのコマンドは db.contacts.validate(); となります。

その他にも、MongoDB には DBA の作業を楽にするさまざまな機能が備わっています。さらに、多種多様なサード・パーティーの管理ツールとインターフェースも利用することができます。詳細については、MongoDB のマニュアルを参照してください。

map/reduce

CouchDB データベースを使用した経験があるとしたら、map/reduce についてはよくご存知のことでしょう。CouchDB のビュー・エンジンはデフォルトで、map/reduce 関数を使用してデータをフィルタリングおよび集約します。しかし、MongoDB では違います。MongoDB では、単純なクエリーとフィルタリングは (さらに集約でさえも) map/reduce に依存しません。ただし、MongoDB では大規模なデータ・セットを集約する際に使用できるように、map/reduce の実装を用意しています。

map/reduce について説明すると、それだけで 1 つの記事が書けるほどなので、MongoDB での map/reduce の実装については、MongoDB のマニュアルを参照してください (「参考文献」にリンクが記載されています)。


MongoDB のスケーリング

キー・バリュー型ストアとドキュメント指向データベースが最近よく使われているようになっている第 1 の理由は、必要なフットプリントが少ないのと同時に、極めてスケーリングしやすいという点にあります。スケーリングを容易にするために MongoDB が依存しているのは、シャーディングとレプリケーションの概念です。このセクションでは、シャーディングおよびレプリケーションの概念を説明し、MongoDB では GridFS を使用することでどのようにしてサイズの大きなファイルを保存できるようにしているかを説明します。最終的には、データベースのパフォーマンスが最適化されるようにクエリーのプロファイリングを行う方法がわかるはずです。

シャーディング

あらゆるデータベース・インフラストラクチャーで重要な部分は、適切なスケーリングが確実にできるようにすることです。MongoDB 実装の場合、自動シャーディング・メカニズムによる水平スケーリングによって、MongoDB 構成を何千ものノードにスケーリングして、自動ロード・バランシングを行い、単一障害点を排除し、自動フェイルオーバーを備えたクラスターを実現できるようになっています。しかも、MongoDB クラスターにはごく簡単に新しいマシンを追加することができます。

MongoDB の自動シャーディング機能の利点は、アプリケーション・コードをほとんど、あるいはまったく変更しなくても、単一のサーバーからシャーディングを使用したクラスターに簡単に移行できることです。自動シャーディングの仕組みとその実装方法についての詳細は、MongoDB のマニュアルを参照してください。

レプリケーション

MongoDB は、(MySQL と同様の) マスター/スレーブ構成のレプリケーション機能を提供しています。その目的は、フェイルオーバーおよび冗長性により、ノード間の高度な一貫性を確実にすることです。別の方法として、MongoDB ではレプリカのセットを使用して、常に 1 次ノードとして機能するノードと、1 次ノードに障害が発生した際にその機能を引き継ぐもう 1 つのノードを定義することもできます。

レプリケーションを拡張性の基礎として使用する CouchDB とは異なり、MongoDB がレプリケーションを使用する主な目的は高可用性です。つまり、スレーブ・ノードを冗長レプリカとして使用することによって、高可用性を確実にします。

MongoDB のレプリケーションについての詳細は、MongoDB のマニュアルを参照してください (「参考文献」にリンクが記載されています)。

GridFS によるサイズの大きなファイルの保存

MongoDB データベースはデータを BSON ドキュメントに保存します。BSON ドキュメントの最大サイズは 4MB なので、大きなサイズのファイルやオブジェクトを保存するのには適していません。大きなサイズのファイルを保存する場合には、MongoDB は GridFS 仕様を使用し、ファイルを小さな塊に分割して複数のドキュメントに保存します。

標準 MongoDB ディストリビューションには、ローカル・システムファイルとの間で GridFS の追加および取得操作を行うためのコマンドライン・ユーティリティーが含まれています。さらに、すべての公式 MongoDB API ドライバーには GridFS のサポートが組み込まれています。詳細については、MongoDB のマニュアルを参照してください (「参考文献」を参照)。


まとめ

この記事では、MongoDB データベース管理システムの概要と、DBMS 市場で人気の高い NoSQL において、MongoDB が最も急速に成長している選択肢の 1 つとなっている理由を説明しました。従来の RDBMS ではなく、ドキュメント指向のデータベースを選ぶ理由について、そして MongoDB が提供するさまざまな優れた機能について説明しました。また、MongoDB をインストールして、データを保存および取得するために使用する方法、提供されている各種のツールおよびスケーラビリティーを実現する方法についても説明しました。

参考文献

学ぶために

  • 公式 MongoDB サイトにアクセスしてください。
  • Wikipedia で MongoDB のページを読んでください。
  • 公式の MongoDB のマニュアルにアクセスしてください。
  • MongoDB の map/reduce 関数について詳しく学んでください。
  • MongoDB Cookbook では、MongoDB の一般的なすべての使用方法について解説しています。
  • Twitter で MongoDB をフォローしてください。
  • developerWorks のデモ「An introduction to MongoDB」を見てください。
  • developerWorks ナレッジ・パスの「Using NoSQL and analyzing big data」で、NoSQL の使用法とビッグ・データの分析について学んでください。
  • Notes from a production MongoDB deployment」で、MySQL から MongoDB に切り替えた企業の実例を読んでください。
  • Reflections on MongoDB」を読んで、Collective Idea が MongoDB に切り替えた理由を学んでください。
  • ブログ投稿「12 Months with MongoDB」を読んで、Wordnik が MongoDB に切り替えた理由を学んでください。
  • Eltot Horowitz (MongoDB を後援している企業、10gen の CTO) が MongoDB について語っているポッドキャストを聴いてください。
  • 10gen では、パフォーマンスと拡張性に優れたオープンソースのドキュメント指向データベース、MongoDB を開発およびサポートしています。
  • Java 開発 2.0: MongoDB: (適切なすべての) RDBMS の動作をする NoSQL データベース」(Andrew Glover 著、developerWorks、2010年9月): この記事では、MongoDB のカスタム API、対話型シェル、そして RDBMS 方式の動的クエリーのサポート、そして素早く簡単な MapReduce 計算についてまとめて説明します。
  • CouchDB を探る」(Joe Lennon 著、developerWorks、2009年3月):Apache によるオープンソースの CouchDB ではデータの保存方法として、スキーマなしのドキュメント指向データベース・モデルと呼ばれる新しい方法が提供されています。リレーショナル・モデルではデータを完全に構造化して保存しますが、 CouchDB では JavaScript ベースのビュー・モデルを使って、構造化された集約を生成するとともに、半構造化ドキュメントからレポートを生成します。
  • 興味深いイベント: 世界中で近日中に予定されている IBM オープンソース開発者を対象とした会議、見本市、ウェブキャストをチェックしてください。
  • developerWorks Open source ゾーン: 開発や IBM 製品でオープンソース技術を使用する際に役立つ広範なハウツー情報、ツール、およびプロジェクト更新を見つけてください。

製品や技術を入手するために

  • MongoDB をダウンロードしてください。
  • IBM ソフトウェアの試用版: 試用版ソフトウェアを使用して、次のオープンソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

議論するために

  • developerWorks コミュニティー: ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者が主導するブログ、フォーラム、グループ、ウィキを調べることができます。developerWorks コミュニティーで、現実世界のオープンソース・グループの構築を手伝ってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=733229
ArticleTitle=MongoDB を探る
publish-date=07222011