MongoDB

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索
MongoDB
MongoDB Logo.png
開発元 MongoDB Inc.
初版 2009年(4年前) (2009
最新版 2.4.9 / 2014年01月10日(3か月前) (2014-01-10
最新評価版 2.5.4 / 2013年11月18日(4か月前) (2013-11-18
プログラミング言語 C++
対応OS クロスプラットフォーム
対応言語 英語
種別 ドキュメント指向データベース英語版
ライセンス GNU AGPL v3.0
(ドライバはApache License
公式サイト www.mongodb.org
テンプレートを表示

MongoDBは、オープンソースドキュメント指向データベース英語版である。C++言語で記述されており、開発とサポートはMongoDB Inc.によって行なわれている。[1]

概要[編集]

MongoDBはRDBMSではなく、いわゆるNoSQLと呼ばれるデータベースに分類されるものである。RDBMSのようにレコードをテーブルに格納するのではなく、「ドキュメント」と呼ばれる構造的データをJSONライクな形式で表現し、そのドキュメントの集合を「コレクション」として管理する(このデータの物理的な格納はBSONと呼ばれるJSONのバイナリ版といえる形式で行われる)。コレクションはRDBMSのような固定的なスキーマを持たない。ドキュメントには複雑な階層構造を持たせることもでき、それらの構造に含まれるフィールドを指定したクエリやインデクス生成も簡単な指定によって行える。RDBMSのように高度な結合操作を効率的に行うことはできないが、データの追加・更新・削除・クエリは高速に行うことができる。また、アプリケーションは自身の構造やデータ型に合った自然な形でデータを格納することができるため、扱うデータの特性によっては、RDBMSよりも容易かつ迅速に開発を行うことができる可能性がある。

Mongoという名前は、英語で「ばかでかい」を意味する "humongous" に由来する。

MongoDBの開発は10gen(現MongoDB Inc.)によって2007年10月から開始され、最初の公開リリースは2009年2月に行われた。[2]

特徴[編集]

特徴の一部:

  • 整合的なUTF-8エンコーディング。非UTF-8データも、特殊なバイナリデータ型によって保存・取得できる。
  • クロスプラットフォームのサポート: バイナリは、Windows, Linux, OS X, Solarisで利用できる。MongoDBはほとんどのリトルエンディアンシステムで利用できる。
  • 豊富なデータ型: 日付、正規表現、バイナリ型、コード、など(すべてのBSONデータ型)
  • クエリ結果にカーソルが使える

アドホックなクエリ[編集]

MongoDBでは、任意のフィールドを好きな時にクエリできる。フィールドの完全一致に加えて、範囲をもつクエリ、正規表現検索など様々な種類のクエリが使える。ユーザ定義のJavaScript関数を述語として使うこともできる(関数がtrueを返したときにドキュメントがマッチする)。

クエリでは、(全フィールドをとりだす代わりに)指定したフィールドだけを取り出せる。また、ソートを行ったり、結果の数を制限したり、一部をスキップすることもできる。

ネストされたフィールドのクエリ[編集]

埋め込みオブジェクトおよび配列にも「たどりつく」ことができる。以下のオブジェクトが users コレクションに挿入されているとする:

{
    "username" : "bob",
    "address" : {
        "street" : "123 Main Street",
        "city" : "Springfield",
        "state" : "NY"
    }
}

このドキュメント(およびNYの住所をもつすべてのドキュメント)は、以下のクエリで取得できる:

> db.users.find({"address.state" : "NY"})

配列の要素を指定することもできる:

> db.food.insert({"fruit" : ["peach", "plum", "pear"]})
> db.food.find({"fruit" : "pear"})

インデックス[編集]

MongoDBは、追加のインデックスをサポートする。インデックスは、単一キー、複合キー、ユニーク/非ユニーク、地理空間インデクス[3]をサポートする。ネストされたフィールドもインデックスできるし、配列型をインデックスすると配列内の各要素がインデックスされる。

MongoDBのクエリオプティマイザはクエリの実行時にいくつかのクエリ計画を試し、最速のものを選択する。定期的に再サンプリングを行う。開発者は使用されるインデックスを `explain` 関数で見ることができ、 `hint` 関数で異なるインデックスを参照できる。

インデックスはいつでも作成・削除できる。

集約[編集]

アドホックなクエリに加えて、MongoDBは集約のためのいくつかのツールをサポートしている。これには、SQLのGRUOP BYに似たgroup関数や、MapReduce[4]などがある。

ファイルストレージ[編集]

MongoDBは、GridFS[5]と呼ばれるプロトコルを実装しており、これを使うことで大きなファイルをデータベースに格納・取得することができる。このファイルストレージ機構はnginx[6]lighttpd [7]のプラグインからも使用できる。

サーバサイドJavaScript実行[編集]

JavaScriptはMondoDBにおけるLingua franca(共通語)であり、クエリや集約関数(MapReduce等)で使用したり、データベースに直接送信して実行できる。

クエリでのJavaScriptの例:

> db.foo.find({$where : function() { return this.x == this.y; }})

データベースに送信して実行させるコードの例:

> db.eval(function(name) { return "Hello, "+name; }, ["Joe"])

これは "Hello, Joe" を返す。

JavaScriptの変数はデータベースに格納でき、他のJavaScriptからグローバル変数として利用できる。関数を含むすべての正当なJavaScript型を格納できるため、JavaScriptを「ストアドプロシージャ」として利用できる。

Cappedコレクション[編集]

MongoDBは、Cappedコレクションと呼ばれる固定サイズのコレクションもサポートしている[8]。Cappedコレクションはサイズ(オプションで要素数も使える)を指定して作成される。capped collectionsは、挿入した順にコレクションを管理する: 指定したサイズに到達したら、古いものから順に削除される。

Cappedコレクションでは、tailable cursor[9]と呼ばれる特殊なカーソルを利用できる。このカーソルの名前は `tail -f` に由来し、結果を返し終えてもクローズせずに待機し続けて、それ以降に追加されたドキュメントを返却しつづける。

デプロイ[編集]

MongoDBはソースファイルからビルドすることもできるが、より一般的にはバイナリパッケージからインストールされる。多くのLinuxパッケージ管理システムはMongoDBのパッケージを含んでいる: CentOSとFedora,[10] DebianとUbuntu,[11] Gentoo[12], Arch Linux。[13] 公式Webサイトから入手することもできる。[14]

MongoDBはメモリマップトファイルを用いるため、32-bitシステムではサイズが2GBに制限される。[15] MongoDBのサーバはリトルエンディアンのシステムのみで動作する。ただし、ほとんどのドライバはビッグエンディアンのシステムでも動作する。

言語サポート[編集]

MongoDBは、以下の言語に公式ドライバを提供している:

非公式のドライバも大量に存在する: C#と.NET,[18] ColdFusion,[28] Delphi,[29] Erlang,[30][31] Factor,[32] Fantom,[33] Go,[34] Java VM 言語(Clojure, Groovy,[35] Scala など),[36] Lua,[37] node.js,[38] HTTP REST,[39] Ruby,[40] Racket,[41] Smalltalk[42]

レプリケーション[編集]

MongoDBはマスタ/スレーブのレプリケーションをサポートする。マスタは書き込みと読み込みを実行できる。スレーブは、マスタからデータをコピーして、読み込みとバックアップのために利用できる(書き込みはできない)。

MondoDBは、各操作について、最低でも N 個のサーバにレプリケートされることを開発者に保証することができる。

マスタ/スレーブ[編集]

操作はマスタに対して行われ、スレーブはデータに対するすべての変更をレプリケートする。

例: マスタ/スレーブのペアをローカルで起動する:

$ mkdir -p ~/dbs/master ~/dbs/slave
$ ./mongod--master --port 10000 --dbpath ~/dbs/master
$ ./mongod--slave --port 10001 --dbpath ~/dbs/slave --source localhost:10000

レプリカセット[編集]

レプリカセットはマスタ/スレーブに似ているが、マスタがダウンしたときにスレーブ間で自動投票を行って、スレーブの1つを新たなマスタにする機能を持つ。

Sharding[編集]

MongoDBは、Sharding[43]というシステムによって水平スケーリングが可能である。これはBigTablePNUTSのスケーリングモデルに非常に良く似ている。開発者はshardキーを選択し、このキーがデータをどのように分散させるかを決める。データ中のキーを元にデータを分散させるshardが決められる。(一つのshardは1つ以上のスレーブを持つマスタである)

アプリケーションはいくつかの操作を行う際に、shardingされたクラスタと対話していることを認識している必要がある。例えば "findAndModify" クエリは、shardされたコレクションからクエリをするときにshardキーを含む必要がある。[44] アプリケーションは、`mongos`と呼ばれる特別なルーティングプロセスと対話する。このプロセスは、shardクラスタを単一のMongoDBサーバに見えるようにする。`mongos`プロセスはどのデータがどのshardにあるかを知っており、クライアントのリクエストを適切にルーティングする。すべてのリクエストはこのプロセスを通して流れる: リクエストやレスポンスを転送するだけでなく、必要に応じてマージやソートも行う。 `mongos`プロセスはいくつでも実行できるが、通常は1つのアプリケーションに対して1つが推奨される。

管理とグラフィカルフロントエンド[編集]

公式ツール[編集]

最もパワフルで便利な管理ツールはデータベースシェルの mongo である。このシェルは、データベースの内容を閲覧・挿入・削除・更新する機能を提供すると同時に、レプリケーション情報を取得したり、shadingを設定したり、サーバを停止したり、JavaScriptを実行したりすることができる。mongoは、SpiderMonkeyの上に構築されているため、MondoDBサーバに接続できると同時に、完全なJavaScriptシェルでもある。

管理情報にはWebベースのadminインタフェースを通してもアクセスできる。これは、現在のサーバ情報を送信するシンプルなHTMLのWebページである。デフォルトでは、このインタフェースにはデータベースのポートの1000番上のポート (http://localhost:28017) からアクセスできる。--norestオプションによってこの機能を無効化できる。

mongostat は、直近の統計情報のシンプルな一覧を表示するコマンドラインツールである。挿入された数、更新された数, 削除された数, クエリの数, 実行されたコマンドの数, データベースがロックされた時間のパーセンテージ、メモリの使用状況などを表示する。

mongosniff は、MongoDBのネットワークトラフィックを覗くツールである。

監視[編集]

MongoDBを監視するためのプラグインが存在する:

GUI[編集]

データの可視化を助けるいくつかのGUIが開発されている:

  • Fang of Mongo[49] - DjangoとjQueryで作られたWebベースのUI
  • Futon4Mongo[50] - CouchDBのFuton Webインタフェースのクローン
  • Mongo3[51] - Rubyベースのインタフェース
  • MongoHub[52] - MongoDBを管理するためのネイティブなOS Xアプリケーション
  • Opricot[53] - PHPで書かれたWebベースのMongoDBシェル
  • Database Master - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • BI Studio - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • RockMongo - PHPベース

ライセンスとサポート[編集]

MongoDBは、GNU Affero General Public Licenseライセンスの下で利用できる。言語ドライバはApache Licenseライセンスの下で利用できる。[54]

批判[編集]

  • データの永続性が保証されないという指摘がある[55]

有名な利用者[編集]

関連項目[編集]

脚注[編集]

  1. ^ MongoDB website
  2. ^ MongoDB Blog - March 2010
  3. ^ Geospatial indexes
  4. ^ MapReduce
  5. ^ GridFS
  6. ^ NGINX
  7. ^ lighttpd
  8. ^ capped collections
  9. ^ [1]
  10. ^ CentOS and Fedora
  11. ^ Debian and Ubuntu,
  12. ^ Gentoo
  13. ^ Arch Linux
  14. ^ official website
  15. ^ [2]
  16. ^ C driver
  17. ^ C++ driver
  18. ^ a b C# driver
  19. ^ Haskell driver
  20. ^ Java driver
  21. ^ JavaScript driver
  22. ^ [3]
  23. ^ Perl driver
  24. ^ PHP driver
  25. ^ Python driver
  26. ^ Ruby driver
  27. ^ Casbah, the officially supported Scala Driver for MongoDB
  28. ^ ColdFusion driver
  29. ^ Delphi
  30. ^ Emongo Erlang driver
  31. ^ Erlmongo Erlang driver
  32. ^ Factor driver
  33. ^ Fantom driver
  34. ^ gomongo Go driver
  35. ^ GMongo
  36. ^ JVM language center
  37. ^ LuaMongo
  38. ^ node.js driver
  39. ^ REST interface
  40. ^ rmongo
  41. ^ [4]
  42. ^ Smalltalk driver
  43. ^ sharding
  44. ^ [5]
  45. ^ Munin plugin
  46. ^ Ganglia plugin
  47. ^ Scout slow-query plugin
  48. ^ Cacti plugin
  49. ^ Fang of Mongo
  50. ^ Futon4Mongo
  51. ^ Mongo3
  52. ^ MongoHub
  53. ^ Opricot
  54. ^ The AGPL - MongoDB Blog: May 5, 2009
  55. ^ Broken by Design: MongoDB Fault Tolerance
  56. ^ MongoDB Powering MTV's Web Properties” (2011年5月10日). 2011年7月6日閲覧。
  57. ^ MongoDB live at craigslist” (2011年5月16日). 2011年7月6日閲覧。
  58. ^ Disney Central Services Storage: Leveraging Knowledge and skillsets” (2011年5月24日). 2011年7月6日閲覧。
  59. ^ 12 Months with MongoDB” (2010年10月25日). 2011年5月24日閲覧。
  60. ^ MongoDB - diasporatest.com” (2010年12月23日). 2010年12月23日閲覧。
  61. ^ Implementing MongoDB at Shutterfly - Presentation at MongoSF” (2010年4月30日). 2010年6月28日閲覧。
  62. ^ MongoDB at foursquare - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  63. ^ bit.ly user history, auto-sharded - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  64. ^ Maher, Jacqueline (2010年5月25日). “Building a Better Submission Form”. NYTimes Open Blog. http://open.blogs.nytimes.com/2010/05/25/building-a-better-submission-form/ 2010年6月28日閲覧。 
  65. ^ How Python, TurboGears, and MongoDB are Transforming SourceForge.net”. PyCon 2010 (2010年2月20日). 2010年6月28日閲覧。
  66. ^ How This Web Site Uses MongoDB”. Business Insider (2010年11月6日). 2010年6月28日閲覧。
  67. ^ MongoDB at Etsy”. Code as Craft: Etsy Developer Blog (2010年5月19日). 2010年6月28日閲覧。 [リンク切れ]
  68. ^ Holy Large Hadron Collider, Batman!”. The MongoDB NoSQL Database Blog (2010年6月3日). 2010年8月3日閲覧。
  69. ^ Building Our Own Tracking Engine With MongoDB”. Thumbtack Blog (2011年5月3日). 2011年5月15日閲覧。
  70. ^ http://appscale.cs.ucsb.edu/datastores.html#mongodb
  71. ^ Node.js Meetup: Distributed Web Architectures ? Curtis Chambers, Uber | JoyentCloud:”. 2011年8月12日閲覧。

外部リンク[編集]