MongoDB
![]() |
|
| 開発元 | 10gen |
|---|---|
| 初版 | 2009 |
| プログラミング言語 | C++ |
| 対応OS | クロスプラットフォーム |
| 対応言語 | 英語 |
| 種別 | ドキュメント指向データベース |
| ライセンス | GNU AGPL v3.0 (ドライバはApache license) |
| 公式サイト | http://www.mongodb.org/ |
MongoDB は、高パフォーマンス、スキーマレス、オープンソースのドキュメント指向データベースである。C++言語で記述されている。[1] MongoDBはRDBMSではない。MongoDBは、BSONというJSONのバイナリ版のような形式でドキュメントを表現し、そのコレクションを管理する。この形式は、複雑な階層を持たせることができ、なおかつクエリやインデックスが容易である。これにより、多くのアプリケーションは、自身のネイティブなデータ型や構造に合った自然な方法でデータを格納できる。
Mongoという名前は、英単語の"humongous"(ばかでかい)に由来する。
MongoDBの開発は10genによって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]などがある。
[編集] ファイルストレージ
MondoDBは、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言語[16]
- C++[17]
- C#[18]
- Haskell[19]
- Java[20]
- JavaScript[21]
- Lisp[22]
- Perl[23]
- PHP[24]
- Python[25]
- Ruby[26]
- Scala[27]
非公式のドライバも大量に存在する: C#と.NET,[18] ColdFusion,[28] Delphi,[29] Erlang,[30][31] Factor,[32] Fantom,[33] Go,[34] JVM languages (Clojure, Groovy,[35] Scala, etc.),[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]というシステムによって水平スケーリングが可能である。これはBigTableやPNUTSのスケーリングモデルに非常に良く似ている。開発者は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もサポートする
[編集] ライセンスとサポート
MongoDBは、GNU Affero General Public Licenseライセンスの下で利用できる。言語ドライバはApache Licenseライセンスの下で利用できる。[54]
[編集] 有名な利用者
- MTV Networks[55]
- craigslist[56]
- Disney Interactive Media Group[57]
- Wordnik[58]
- diaspora[59]
- Shutterfly[60]
- foursquare[61]
- bit.ly[62]
- The New York Times[63]
- SourceForge[64]
- Business Insider[65]
- Etsy[66]
- CERN LHC[67]
- Thumbtack[68]
- AppScale[69]
- Uber[70]
[編集] 関連項目
[編集] References
- ^ MongoDB website
- ^ MongoDB Blog - March 2010
- ^ Geospatial indexes
- ^ MapReduce
- ^ GridFS
- ^ NGINX
- ^ lighttpd
- ^ capped collections
- ^ [1]
- ^ CentOS and Fedora
- ^ Debian and Ubuntu,
- ^ Gentoo
- ^ Arch Linux
- ^ official website
- ^ [2]
- ^ C driver
- ^ C++ driver
- ^ a b C# driver
- ^ Haskell driver
- ^ Java driver
- ^ JavaScript driver
- ^ [3]
- ^ Perl driver
- ^ PHP driver
- ^ Python driver
- ^ Ruby driver
- ^ Casbah, the officially supported Scala Driver for MongoDB
- ^ ColdFusion driver
- ^ Delphi
- ^ Emongo Erlang driver
- ^ Erlmongo Erlang driver
- ^ Factor driver
- ^ Fantom driver
- ^ gomongo Go driver
- ^ GMongo
- ^ JVM language center
- ^ LuaMongo
- ^ node.js driver
- ^ REST interface
- ^ rmongo
- ^ [4]
- ^ Smalltalk driver
- ^ sharding
- ^ [5]
- ^ Munin plugin
- ^ Ganglia plugin
- ^ Scout slow-query plugin
- ^ Cacti plugin
- ^ Fang of Mongo
- ^ Futon4Mongo
- ^ Mongo3
- ^ MongoHub
- ^ Opricot
- ^ The AGPL - MongoDB Blog: May 5, 2009
- ^ “MongoDB Powering MTV's Web Properties” (2011年5月10日). 2011年7月6日閲覧。
- ^ “MongoDB live at craigslist” (2011年5月16日). 2011年7月6日閲覧。
- ^ “Disney Central Services Storage: Leveraging Knowledge and skillsets” (2011年5月24日). 2011年7月6日閲覧。
- ^ “12 Months with MongoDB” (2010年10月25日). 2011年5月24日閲覧。
- ^ “MongoDB - diasporatest.com” (2010年12月23日). 2010年12月23日閲覧。
- ^ “Implementing MongoDB at Shutterfly - Presentation at MongoSF” (2010年4月30日). 2010年6月28日閲覧。
- ^ “MongoDB at foursquare - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
- ^ “bit.ly user history, auto-sharded - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
- ^ Maher, Jacqueline (2010年5月25日). “Building a Better Submission Form”. NYTimes Open Blog 2010年6月28日閲覧。
- ^ “How Python, TurboGears, and MongoDB are Transforming SourceForge.net”. PyCon 2010 (2010年2月20日). 2010年6月28日閲覧。
- ^ “How This Web Site Uses MongoDB”. Business Insider (2010年11月6日). 2010年6月28日閲覧。
- ^ “MongoDB at Etsy”. Code as Craft: Etsy Developer Blog (2010年5月19日). 2010年6月28日閲覧。 [リンク切れ]
- ^ “Holy Large Hadron Collider, Batman!”. The MongoDB NoSQL Database Blog (2010年6月3日). 2010年8月3日閲覧。
- ^ “Building Our Own Tracking Engine With MongoDB”. Thumbtack Blog (2011年5月3日). 2011年5月15日閲覧。
- ^ http://appscale.cs.ucsb.edu/datastores.html#mongodb
- ^ “Node.js Meetup: Distributed Web Architectures ? Curtis Chambers, Uber | JoyentCloud:”. 2011年8月12日閲覧。
