MongoDB

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索
MongoDB
開発元 MongoDB Inc.
初版 2009年(8年前) (2009
最新版 3.4.6 / 2017年7月5日(19日前) (2017-07-05[1]
リポジトリ github.com/mongodb/mongo
プログラミング言語 C++
対応OS クロスプラットフォーム
対応言語 英語
種別 ドキュメント指向データベース
ライセンス GNU AGPL v3.0
(ドライバはApache License
公式サイト www.mongodb.org
テンプレートを表示

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

概要[編集]

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

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

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

2014年12月にデータベースストレージエンジンのWiredTigerを買収し[5]、2015年のメジャーアップデートリリースのバージョン3.0より内部に組み込まれた。ドキュメント単位でのロックが可能になったことで特にデータ書き込み時においてのパフォーマンスが改善している[6]

人気のあるデータベースをランキング形式でを公表しているDB-Enginesによると2017年7月の時点でOracle DatabaseMySQLMicrosoft SQL ServerPostgreSQL等の歴史あるRDBMSプロダクトに続き5位となっており[7]、2000年代後半より多数作られたNoSQLデータベースの中で頭一つ抜けたシェアを占めている。

特徴[編集]

特徴の一部:

  • 整合的なUTF-8エンコーディング。非UTF-8データも、特殊なバイナリデータ型によって保存・取得できる。
  • クロスプラットフォームのサポート: バイナリは、Windows, Linux, macOS, Solaris(x86のみ)で利用できる。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は、追加のインデックスをサポートする。インデックスは、単一キー、複合キー、ユニーク/非ユニーク、地理空間インデクス[8]をサポートする。ネストされたフィールドもインデックスできるし、配列型をインデックスすると配列内の各要素がインデックスされる。

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

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

集約[編集]

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

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

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

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

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

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

デプロイ[編集]

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

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

言語サポート[編集]

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


非公式のドライバも大量に存在する: C#と.NET,[35] ColdFusion,[36] Delphi,[37] Erlang,[38][39] Factor,[40] Fantom,[41] Go,[42] Java VM 言語(Clojure, Groovy,[43] Scala など),[44] Lua,[45] HTTP REST,[46] Ruby,[47] Racket,[48] Smalltalk[49]

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

MongoDBは、レプリカセット (Replica Sets) と呼ぶ仕組みによって高い可用性を提供する。1つのレプリカセットはデータの2つ以上のコピーからなる。レプリカセットの各メンバーは、常時、プライマリレプリカもしくはセカンダリレプリカとしての役割を果す。プライマリレプリカはすべての書き込みおよび読み込みを実行する。セカンダリレプリカは、組み込みのレプリケーションを用いて、プライマリにあるデータのコピーを保持する。プライマリレプリカが機能しなくなった時は、レプリカセットが自動的に投票プロセスを開始して、どのセカンダリがプライマリになるべきかを決定する。

シャーディング(Sharding)[編集]

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

アプリケーションはいくつかの操作を行う際に、shardingされたクラスタと対話していることを認識している必要がある。例えば "findAndModify" クエリは、shardされたコレクションからクエリをするときにshardキーを含む必要がある。[52] アプリケーションは、`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[57] - DjangoとjQueryで作られたWebベースのUI
  • Futon4Mongo[58] - CouchDBのFuton Webインタフェースのクローン
  • Mongo3[59] - Rubyベースのインタフェース
  • MongoHub[60] - MongoDBを管理するためのネイティブなmacOSアプリケーション
  • Opricot[61] - PHPで書かれたWebベースのMongoDBシェル
  • Database Master - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • BI Studio - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • RockMongo - PHPベース

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

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

批判[編集]

  • 過去のバージョンにおいて、設計上の問題によりデータの永続性が保証されないと指摘されたことがある[63]

有名な利用者[編集]

関連項目[編集]

脚注[編集]

  1. ^ Release Notes for MongoDB 3.4
  2. ^ MongoDB website
  3. ^ https://www.mongodb.com/jp
  4. ^ MongoDB Blog - March 2010
  5. ^ https://www.mongodb.com/press/wired-tiger
  6. ^ https://www.mongodb.com/mongodb-3.0
  7. ^ https://db-engines.com/en/ranking
  8. ^ Geospatial indexes
  9. ^ MapReduce
  10. ^ GridFS
  11. ^ NGINX
  12. ^ lighttpd
  13. ^ capped collections
  14. ^ [1]
  15. ^ Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux — MongoDB Manual
  16. ^ Install MongoDB Community Edition on Debian — MongoDB Manual
  17. ^ Install MongoDB Community Edition on Ubuntu — MongoDB Manual
  18. ^ Gentoo
  19. ^ Arch Linux - mongodb (x86_64)
  20. ^ Install MongoDB Community Edition From Tarball — MongoDB Manual
  21. ^ [2]
  22. ^ C driver
  23. ^ C++ driver
  24. ^ C# driver
  25. ^ Haskell driver
  26. ^ Java driver
  27. ^ JavaScript driver
  28. ^ [3]
  29. ^ Perl driver
  30. ^ PHP driver
  31. ^ Python driver
  32. ^ Ruby driver
  33. ^ Casbah, the officially supported Scala Driver for MongoDB
  34. ^ node.js Driver for MongoDB
  35. ^ C# and .NET drivers
  36. ^ ColdFusion driver
  37. ^ Delphi
  38. ^ Emongo Erlang driver
  39. ^ Erlmongo Erlang driver
  40. ^ Factor driver
  41. ^ Fantom driver
  42. ^ gomongo Go driver
  43. ^ GMongo
  44. ^ JVM language center
  45. ^ LuaMongo
  46. ^ REST interface
  47. ^ rmongo
  48. ^ [4]
  49. ^ Smalltalk driver
  50. ^ sharding
  51. ^ 開発者が知っておくべき、ドキュメント・データベースの基礎 (3/3)
  52. ^ [5]
  53. ^ Munin plugin
  54. ^ Ganglia plugin
  55. ^ Scout slow-query plugin
  56. ^ Cacti plugin
  57. ^ Fang of Mongo
  58. ^ Futon4Mongo
  59. ^ Mongo3
  60. ^ MongoHub
  61. ^ Opricot
  62. ^ The AGPL - MongoDB Blog: May 5, 2009
  63. ^ Broken by Design: MongoDB Fault Tolerance
  64. ^ MongoDB Powering MTV's Web Properties” (2011年5月10日). 2011年7月6日閲覧。
  65. ^ MongoDB live at craigslist” (2011年5月16日). 2011年7月6日閲覧。
  66. ^ Disney Central Services Storage: Leveraging Knowledge and skillsets” (2011年5月24日). 2011年7月6日閲覧。
  67. ^ 12 Months with MongoDB” (2010年10月25日). 2011年5月24日閲覧。
  68. ^ MongoDB - diasporatest.com” (2010年12月23日). 2010年12月23日閲覧。
  69. ^ Implementing MongoDB at Shutterfly - Presentation at MongoSF” (2010年4月30日). 2010年6月28日閲覧。
  70. ^ MongoDB at foursquare - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  71. ^ bit.ly user history, auto-sharded - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  72. ^ Maher, Jacqueline (2010年5月25日). “Building a Better Submission Form”. NYTimes Open Blog. https://open.blogs.nytimes.com/2010/05/25/building-a-better-submission-form/ 2010年6月28日閲覧。 
  73. ^ How Python, TurboGears, and MongoDB are Transforming SourceForge.net”. PyCon 2010 (2010年2月20日). 2010年6月28日閲覧。
  74. ^ How This Web Site Uses MongoDB”. Business Insider (2010年11月6日). 2010年6月28日閲覧。
  75. ^ MongoDB at Etsy”. Code as Craft: Etsy Developer Blog (2010年5月19日). 2010年6月28日閲覧。 [リンク切れ]
  76. ^ “[hhttps://www.mongodb.com/blog/post/holy-large-hadron-collider-batman Holy Large Hadron Collider, Batman!]”. The MongoDB NoSQL Database Blog (2010年6月3日). 2010年8月3日閲覧。
  77. ^ Building Our Own Tracking Engine With MongoDB”. Thumbtack Blog (2011年5月3日). 2011年5月15日閲覧。
  78. ^ http://appscale.cs.ucsb.edu/datastores.html#mongodb
  79. ^ Node.js Meetup: Distributed Web Architectures ? Curtis Chambers, Uber | JoyentCloud:”. 2011年8月12日閲覧。
  80. ^ AmebaのMongoDB 活用事例”. Ameba (2012年8月27日). 2015年10月11日閲覧。

外部リンク[編集]