[go: up one dir, main page]

MongoDB

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

MongoDB(モンゴDB)は、ドキュメント指向データベースである。開発とサポートはMongoDB Inc.が行なっている[2]ソースアベイラブルServer Side Public License英語版 (SSPL) で提供されている。

MongoDB
Robomongo 0.8.5
開発元 MongoDB Inc.
初版 2009年 (15年前) (2009)
最新版 5.0.8 - 2022年4月25日 (2年前) (2022-04-25)[1] [±]
リポジトリ ウィキデータを編集
プログラミング
言語
C++
対応OS クロスプラットフォーム
対応言語 英語
種別 ドキュメント指向データベース
ライセンス Server Side Public License(ソースアベイラブル)
(ドライバはApache License
公式サイト www.mongodb.org
テンプレートを表示

概要

編集

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によると2018年2月の時点でOracle DatabaseMySQLMicrosoft SQL ServerPostgreSQL等の歴史あるRDBMSプロダクトに続き5位となっており[7]、2000年代後半より多数作られたNoSQLデータベースの中で頭一つ抜けたシェアを占めている。

2019年1月にAWSによってMongoDB互換のAmazon DocumentDBがリリースされた[8]

特徴

編集

特徴の一部:

  • 整合的なUTF-8エンコーディング。非UTF-8データも、特殊なバイナリデータ型によって保存・取得できる。
  • クロスプラットフォームのサポート: x86_64アーキテクチャではWindows, Linux, macOSで利用できる。ARM64, PPC64LE, s390xなどのアーキテクチャでもLinuxでサポートされている[9]。SolarisはMongoDB 3.4を最後にサポートが打ち切られた[10]
  • 豊富なデータ型: 日付、正規表現、バイナリ型、コード、など(すべての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は、追加のインデックスをサポートする。インデックスは、単一キー、複合キー、ユニーク/非ユニーク、地理空間インデクス[11]をサポートする。ネストされたフィールドもインデックスできるし、配列型をインデックスすると配列内の各要素がインデックスされる。

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

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

集約

編集

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

ファイルストレージ

編集

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

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

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

デプロイ

編集

MongoDBはソースファイルからビルドすることもできるが、より一般的にはバイナリパッケージからインストールされる。多くのLinuxパッケージ管理システムはMongoDBのパッケージを含んでいる: CentOSFedora,[18] DebianUbuntu,[19][20] Gentoo[21]Arch Linuxは以前は公式レポジトリーで提供していたが、MongoDB のライセンス変更により削除された [22]。2022年現在はAUR[23][24]で提供されている。

公式Webサイトから入手することもできる。[25]

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

言語サポート

編集

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

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

レプリケーション

編集

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

シャーディング(Sharding)

編集

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

アプリケーションはいくつかの操作を行う際に、shardingされたクラスタと対話していることを認識している必要がある。例えば "findAndModify" クエリは、shardされたコレクションからクエリをするときにshardキーを含む必要がある。[58] アプリケーションは、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が開発されている:

  • Fang of Mongo[63] - DjangoとjQueryで作られたWebベースのUI
  • Futon4Mongo[64] - CouchDBのFuton Webインタフェースのクローン
  • Mongo3[65] - Rubyベースのインタフェース
  • MongoHub[66] - MongoDBを管理するためのネイティブなmacOSアプリケーション
  • Opricot[67] - PHPで書かれたWebベースのMongoDBシェル
  • Database Master - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • BI Studio - WindowsベースのMongoDB管理ツール。RDBMSもサポートする
  • RockMongo - PHPベース
  • Robo 3T (旧 Robomongo) - mongo shellを内蔵したクロスプラットフォーム(Windows, Mac, Linux)なMongoDB管理ツール

ライセンスとサポート

編集

MongoDB Community Serverは、ソースアベイラブルServer Side Public License (SSPL) の下で利用できる。[68][69] 元々はオープンソースGNU Affero General Public License (AGPL) が適用されていたが、クラウド事業者がMongoDBをSaaSとして提供しながらコミュニティに還元しないことが問題となり、2018年10月16日をもってより利用に制限のあるSSPLへと移行した[69]。言語ドライバはオープンソースのApache Licenseライセンスの下で利用できる。[70][71] AGPL ver.3としてライセンスされている最新バージョンは4.0.3(安定)および4.1.4である。

批判

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

有名な利用者

編集

関連項目

編集

脚注

編集
  1. ^ Release Notes for MongoDB 5.0”. MongoDB, Inc. 2021年10月2日閲覧。
  2. ^ The most popular database for modern apps” (英語). MongoDB. 2019年10月20日閲覧。
  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. ^ DB-Engines Ranking - popularity ranking of database management systems
  8. ^ New – Amazon DocumentDB (with MongoDB Compatibility): Fast, Scalable, and Highly Available” (英語). Amazon Web Services (2019年1月9日). 2019年1月10日閲覧。
  9. ^ Supported Platforms”. 2020年7月25日閲覧。
  10. ^ Farewell, Solaris”. 2020年7月25日閲覧。
  11. ^ Geospatial indexes
  12. ^ MapReduce
  13. ^ GridFS
  14. ^ NGINX
  15. ^ lighttpd
  16. ^ capped collections
  17. ^ [1]
  18. ^ Install MongoDB Community Edition on Red Hat or CentOS — MongoDB Manual” (英語). www.mongodb.com. 2022年11月17日閲覧。
  19. ^ Install MongoDB Community Edition on Debian — MongoDB Manual” (英語). www.mongodb.com. 2022年11月17日閲覧。
  20. ^ Install MongoDB Community Edition on Ubuntu — MongoDB Manual” (英語). www.mongodb.com. 2022年11月17日閲覧。
  21. ^ dev-db/mongodb – Gentoo Packages”. packages.gentoo.org. 2022年11月17日閲覧。
  22. ^ [arch-dev-public Mongodb and SSPL - Arch-dev-public - lists.archlinux.org]” (英語). lists.archlinux.org. 2022年11月17日閲覧。
  23. ^ AUR (en) - mongodb”. aur.archlinux.org. 2022年11月17日閲覧。
  24. ^ AUR (en) - mongodb-bin”. aur.archlinux.org. 2022年11月17日閲覧。
  25. ^ Install MongoDB Community Edition on Red Hat or CentOS — MongoDB Manual” (英語). www.mongodb.com. 2022年11月17日閲覧。
  26. ^ [2]
  27. ^ C driver
  28. ^ C++ driver
  29. ^ C# driver
  30. ^ Haskell driver
  31. ^ Java driver
  32. ^ JavaScript driver
  33. ^ [3]
  34. ^ Perl driver
  35. ^ PHP driver
  36. ^ Python driver
  37. ^ Ruby driver
  38. ^ Casbah, the officially supported Scala Driver for MongoDB
  39. ^ node.js Driver for MongoDB
  40. ^ C# and .NET drivers
  41. ^ ColdFusion driver
  42. ^ Delphi
  43. ^ Emongo Erlang driver
  44. ^ Erlmongo Erlang driver
  45. ^ Factor driver
  46. ^ Fantom driver
  47. ^ gomongo Go driver
  48. ^ GMongo
  49. ^ JVM language center
  50. ^ LuaMongo
  51. ^ REST interface
  52. ^ rmongo
  53. ^ [4]
  54. ^ Smalltalk driver
  55. ^ mongodb”. 2019年12月14日閲覧。
  56. ^ sharding
  57. ^ 開発者が知っておくべき、ドキュメント・データベースの基礎 (3/3)
  58. ^ [5]
  59. ^ Munin plugin
  60. ^ Ganglia plugin
  61. ^ Scout slow-query plugin
  62. ^ Cacti plugin
  63. ^ Fang of Mongo
  64. ^ Futon4Mongo
  65. ^ Mongo3
  66. ^ MongoHub
  67. ^ Opricot
  68. ^ “MongoDB Issues New Server Side Public License for MongoDB Community Server” (英語). MongoDB. https://www.mongodb.com/press/mongodb-issues-new-server-side-public-license-for-mongodb-community-server 2018年10月18日閲覧。 
  69. ^ a b MongoDB now released under the Server Side Public License | MongoDB” (英語). MongoDB. 2018年10月18日閲覧。
  70. ^ The AGPL - MongoDB Blog: May 5, 2009
  71. ^ “Server Side Public License FAQ” (英語). MongoDB. https://www.mongodb.com/licensing/server-side-public-license/faq#spark 2018年10月18日閲覧。 
  72. ^ Broken by Design: MongoDB Fault Tolerance
  73. ^ MongoDB Powering MTV's Web Properties” (2011年5月10日). 2011年7月6日閲覧。
  74. ^ MongoDB live at craigslist” (2011年5月16日). 2011年7月6日閲覧。
  75. ^ Disney Central Services Storage: Leveraging Knowledge and skillsets” (2011年5月24日). 2011年7月6日閲覧。
  76. ^ 12 Months with MongoDB” (2010年10月25日). 2011年5月24日閲覧。
  77. ^ MongoDB - diasporatest.com” (2010年12月23日). 2010年12月23日閲覧。
  78. ^ Implementing MongoDB at Shutterfly - Presentation at MongoSF” (2010年4月30日). 2010年6月28日閲覧。
  79. ^ MongoDB at foursquare - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  80. ^ bit.ly user history, auto-sharded - Presentation at MongoNYC” (2010年5月21日). 2010年6月28日閲覧。
  81. ^ 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日閲覧。 
  82. ^ How Python, TurboGears, and MongoDB are Transforming SourceForge.net”. PyCon 2010 (2010年2月20日). 2010年6月28日閲覧。
  83. ^ How This Web Site Uses MongoDB”. Business Insider (2010年11月6日). 2010年6月28日閲覧。
  84. ^ MongoDB at Etsy”. Code as Craft: Etsy Developer Blog (2010年5月19日). 2010年6月28日閲覧。 [リンク切れ]
  85. ^ Holy Large Hadron Collider, Batman!”. The MongoDB NoSQL Database Blog (2010年6月3日). 2010年8月3日閲覧。
  86. ^ Building Our Own Tracking Engine With MongoDB”. Thumbtack Blog (2011年5月3日). 2011年5月15日閲覧。
  87. ^ http://appscale.cs.ucsb.edu/datastores.html#mongodb
  88. ^ Node.js Meetup: Distributed Web Architectures ? Curtis Chambers, Uber | JoyentCloud:”. 12 August 2011閲覧。
  89. ^ AmebaのMongoDB 活用事例”. Ameba (2012年8月27日). 2015年10月11日閲覧。
  90. ^ Connect to Amadeus travel APIs | Amadeus for Developers” (英語). Amadeus IT Group SA. 2020年7月24日閲覧。
  91. ^ 2018 MongoDB Innovation Award Winners”. 2020年7月25日閲覧。
  92. ^ POSTMORTEM OF SERVICE OUTAGE 4/11/2018 - 4/12/2018”. 2020年7月25日閲覧。
  93. ^ Monitor Operational & Production Data with FANUC MT-LINKi | FANUC America”. www.fanucamerica.com. 2020年7月24日閲覧。
  94. ^ 電力サービスでのMongoDB運用”. IIJ Engineers Blog. 2020年7月24日閲覧。
  95. ^ optim-kousuke-kurihara (1555921800). “Kubernetesを用いたMongoDBクラスタの構築と運用”. OPTiM TECH BLOG. 2020年7月24日閲覧。
  96. ^ MongoDB and Apache Spark at China Eastern Airlines: Delivering 100x Performance Improvements | MongoDB Blog” (英語). MongoDB. 2020年7月24日閲覧。

外部リンク

編集