| モンゴDB | |
|---|---|
| 開発者 | MongoDB株式会社 |
| 初回リリース | 2009年2月11日[ 1 ] (2009年2月11日) |
| 安定版リリース | 8.2.3 [ 2 ] |
| リポジトリ | |
| 書かれた | C++、JavaScript、Python、C |
| オペレーティング·システム | Windows Vista以降、Linux、OS X 10.7以降、Solaris、[ 3 ] FreeBSD [ 4 ] |
| 入手可能な | 英語 |
| タイプ | ドキュメント指向データベース |
| ライセンス | サーバーサイドパブリックライセンスまたは独自ライセンス |
| Webサイト | mongodb.com |
MongoDBは、ソースコードが利用可能で、クロスプラットフォームのドキュメント指向データベースプログラムです。NoSQLデータベース製品に分類されるMongoDBは、JSONのようなドキュメント(BSONと呼ばれる)とオプションのスキーマを使用します。2009年2月に10gen(現MongoDB Inc.)によってリリースされ、シャーディング、レプリケーション、ACIDトランザクション(バージョン4.0以降)などの機能をサポートしています。MongoDBのマネージドクラウドサービスであるMongoDB Atlasは、 AWS、Google Cloud Platform、Microsoft Azureで動作します。現在のバージョンは、Server Side Public License (SSPL)に基づいてライセンスされています。MongoDBはMACH Allianceのメンバーです。
アメリカのソフトウェア企業10genは、2007年に計画されていたPaaS(Platform as a Service)製品の一部としてMongoDBの開発を開始しました。2009年にはオープンソース開発モデルに移行し、商用サポートなどのサービス提供を開始しました。2013年には、10genはMongoDB Inc.に社名を変更しました。[ 5 ]
2017年10月20日、MongoDBは株式公開企業となり、NASDAQにMDBとして上場し、IPO価格は1株あたり24ドルでした。[ 6 ]
2018年11月8日、安定版リリース4.0.4で、ソフトウェアのライセンスがAGPL 3.0からSSPLに変更されました。[ 7 ] [ 8 ]
2019年10月30日、MongoDBはAlibaba Cloudと提携し、Alibaba Cloudの顧客にMongoDB as a Serviceソリューションを提供しました。お客様は、Alibabaのグローバルデータセンターからこのマネージドサービスを利用できます。[ 9 ]
2025年12月、「MongoBleed」と名付けられた大規模なエクスプロイトが発見されました。このエクスプロイトにより、多くの企業サーバーが侵害されました。[ 10 ] [ 11 ]
2025年5月時点で、MongoDBは5番目に人気のあるデータベースソフトウェアでした。[ 12 ] [ 13 ]主に、非構造化で「乱雑な」データの大規模データベースの管理に重点を置いています。[ 14 ] [ 15 ]通常、非構造化データベースをよく使用するモバイルアプリやWebアプリで使用されます。[ 16 ] 2024年の時点で、MongoDBの顧客は5万人いました。[ 16 ] MongoDBはもともとNoSQLデータベース製品として最もよく知られていました。[ 17 ]同社は2016年にAtlasと呼ばれるデータベース・アズ・ア・サービス製品をリリースし[ 18 ] 、 2024年までにMongoDBの収益の70%を占めるようになりました。[ 16 ]時間の経過とともに、MongoDBは分析、トランザクションデータベース、[ 19 ]暗号化、[ 20 ]ベクターデータベース、[ 16 ] ACID、移行機能、その他のエンタープライズツールを追加しました。[ 21 ]当初、MongoDBソフトウェアはAGPLライセンスの下で無料のオープンソースでした[ 18 ]。MongoDBは2018年以降のリリースではSSPL (サーバー側パブリックライセンス)を採用しました。 [ 16 ] [ 22 ]
MongoDBは、フィールド検索、範囲検索、正規表現検索をサポートしています。[ 23 ]クエリはドキュメントの特定のフィールドを返すことができ、ユーザー定義のJavaScript関数を含めることもできます。また、指定されたサイズの結果のランダムサンプルを返すようにクエリを設定することもできます。
MongoDB ドキュメント内のフィールドには、プライマリ インデックスとセカンダリ インデックスを作成できます。
MongoDBはレプリカセットによって高可用性を実現します。[ 24 ]レプリカセットは2つ以上のデータのコピーで構成されます。レプリカセットの各メンバーは、いつでもプライマリレプリカまたはセカンダリレプリカの役割を果たすことができます。すべての書き込みと読み取りは、デフォルトでプライマリレプリカで行われます。セカンダリレプリカは、組み込みのレプリケーションを使用してプライマリのデータのコピーを維持します。プライマリレプリカに障害が発生すると、レプリカセットは自動的に選出プロセスを実行し、どのセカンダリがプライマリになるかを決定します。セカンダリはオプションで読み取り操作を処理することもできますが、そのデータはデフォルトで 結果整合性のみとなります。
複製されたMongoDBのデプロイメントにセカンダリメンバーが1つしかない場合、「アービター」と呼ばれる別のデーモンをセットに追加する必要があります。アービターは、新しいプライマリの選出を解決するという唯一の責任を持ちます。 [ 25 ]結果として、理想的な分散型MongoDBデプロイメントでは、プライマリとセカンダリがそれぞれ1つずつの場合でも、少なくとも3台の独立したサーバーが必要になります。[ 25 ]
MongoDBはシャーディングを用いて水平方向にスケーリングします。[ 26 ]ユーザーはシャードキーを選択し、コレクション内のデータがどのように分散されるかを決定します。データはシャードキーに基づいて範囲に分割され、複数のシャード(マスターと1つ以上のレプリカを持つ)に分散されます。また、シャードキーをハッシュ化してシャードにマッピングすることで、均等なデータ分散が可能になります。
MongoDB は複数のサーバーで実行できるため、負荷を分散したりデータを複製したりして、ハードウェア障害が発生した場合でもシステムの機能を維持できます。
MongoDB は、ファイルを保存するための複数のマシン間での負荷分散およびデータ複製機能を備えた GridFSと呼ばれるファイル システムとして使用できます。
この機能はグリッドファイルシステムと呼ばれ、[ 27 ] MongoDBドライバに含まれています。MongoDBは、開発者向けにファイル操作とコンテンツのための機能を公開しています。GridFSは、mongofilesユーティリティまたはNginx [ 28 ]およびlighttpd [ 29 ]のプラグインを使用してアクセスできます。GridFSはファイルをチャンクと呼ばれる部分に分割し、各チャンクを個別のドキュメントとして保存します。[ 30 ]
MongoDBは、集約を実行するための3つの方法を提供しています。集約パイプライン、マップ削減関数、および単一目的の集約方法です。[ 31 ]
マップリデュースはデータのバッチ処理や集計操作に使用できます。しかし、MongoDBのドキュメントによると、ほとんどの集計操作では集計パイプラインの方がパフォーマンスが向上します。[ 32 ]
集計フレームワークを使用すると、 SQL GROUP BY句を含むクエリで返される結果と同様の結果を取得できます。集計演算子を連結して、Unixのパイプに似たパイプラインを形成できます。集計フレームワークには、複数のコレクションのドキュメントを結合できる$lookup演算子や、標準偏差などの統計演算子が含まれています。
MongoDBは、キャップドコレクションと呼ばれる固定サイズのコレクションをサポートしています。このタイプのコレクションは挿入順序を維持し、指定されたサイズに達すると循環キューのように動作します。
MongoDBは2018年6月の4.0リリース以降、マルチドキュメントACIDトランザクションをサポートしています。[ 33 ]
2018年10月現在、MongoDBは、プロジェクトが開発した非フリーライセンスであるServer Side Public License (SSPL)の下でリリースされています。これはGNU Affero General Public Licenseに代わるものです。AGPLとは対照的に、SSPLはMongoDB Inc.以外がMongoDBを「サービスとして利用可能」にするためには、MongoDB Inc.と別途ライセンスを交渉する必要があります。ライセンス文には、MongoDB Inc.がAGPLに類似していると主張しているものの、実際には遵守不可能な条件が規定されています。この条件は、「プログラムをサービスとして利用可能」にするために使用するすべてのプログラム」はSSPLの下で公開されなければならないというものです。しかし、MongoDBのコアコンポーネントであるWiredTigerはGPLとしてライセンスされており、GPLはGPL以外のライセンスの下での再配布を許可していません。これは著作権者(MongoDB Inc.)には適用されません。 2018 年に MongoDB が SSPL を採用して以来、MongoDB を SSPL ライセンスに基づいて有料サービスとして提供した企業はありません (MongoDB Inc. を含む)。
[ 34 ] [ 35 ] SSPLはオープンソース・イニシアティブに認証のために提出されたが、後に撤回された。[ 36 ] 2021年1月、オープンソース・イニシアティブはSSPLはオープンソース・ライセンスではないと発表した。[ 37 ]言語ドライバはApacheライセンスの下で利用可能である。さらに、MongoDB Inc.はMongoDBの独自ライセンスを提供している。AGPLバージョン3としてライセンスされている最新バージョンは4.0.3(安定版)と4.1.4である。[ 38 ]
MongoDBは、ライセンス変更により、Debian、Fedora、Red Hat Enterprise Linuxディストリビューションから削除されました。Fedoraは、SSPLバージョン1が商用ユーザーに対して「意図的に差別的な扱いをするように作成されている」ため、フリーソフトウェアライセンスではないと判断しました。 [ 39 ] [ 40 ]
MongoDBのデフォルトのセキュリティ設定では、すべてのユーザーがデータベースにフルアクセスできるため、数万台ものMongoDBインストールからデータが盗まれました。さらに、多くのMongoDBサーバーが身代金目的で拘束されました。[ 41 ] [ 42 ] 2017年9月、MongoDBの製品セキュリティ責任者であるDavi Ottenheimer氏は、これらのリスクに対する防御策を講じたと発表しました。[ 43 ]
アプリケーションが互いにアクセスできない2つの異なるMongoDBプロセスにアクセスできるような障害シナリオでは、MongoDBが古い読み取りを返す可能性があります。また、MongoDBは確認済みの書き込みをロールバックする可能性もあります。[ 44 ]この問題は、2016年11月にリリースされたバージョン3.4.0で修正され、[ 45 ]バージョン3.2.12以降のリリースにも適用されました。[ 46 ]
バージョン2.2より前は、ロックはサーバープロセスごとに実装されていました。バージョン2.2では、ロックはデータベースレベルで実装されました。[ 47 ]バージョン3.0以降では、[ 48 ]プラガブルストレージエンジンが利用可能になり、各ストレージエンジンはロックを異なる方法で実装できます。[ 48 ] MongoDB 3.0では、MMAPv1ストレージエンジンのロックはコレクションレベルで実装されていますが、 [ 49 ] WiredTigerストレージエンジンは、ドキュメントレベルのロックを効果的に提供する楽観的同時実行プロトコルを使用しています。[ 50 ] 3.0より前のバージョンでも、同時実行性を向上させる方法の1つはシャーディングを使用することです。[ 51 ]状況によっては、読み取りと書き込みによってロックが解放されます。MongoDBがページがメモリ内に存在しない可能性が高いと予測した場合、ページのロード中に操作によってロックが解放されます。ロック解放の使用はバージョン2.2で大幅に拡大されました。[ 52 ]
MongoDB バージョン3.3.11までは、照合順序に基づくソートが実行できず、 memcmpによるバイト単位の比較のみに制限されていました。そのため、 Unicodeエンコーディングで使用した場合、多くの英語以外の言語で正しい順序付けができませんでした。この問題は2016年8月23日に修正されました。
MongoDB 4.0より前のバージョンでは、インデックスに対するクエリはアトミックではありませんでした。クエリ実行中に更新されたドキュメントは、読み込まれない可能性がありました。[ 53 ] MongoDB 4.0でスナップショット読み取りの導入により、このリスクは解消されました。[ 54 ]
MongoDBは、バージョン3.6.4がジェプセンによる「業界で最も厳しいデータの安全性、正確性、一貫性のテスト」に合格したと主張し、「MongoDBは現在利用可能なデータベースの中で最も強力なデータの一貫性、正確性、安全性の保証を提供している」と述べた。[ 55 ]自らを「分散システムの安全性研究会社」と称するジェプセンは、 Twitterで両方の主張に異議を唱え、「そのレポートでは、MongoDBはデフォルトでデータを失い、causalに違反した」と述べた。2020年5月のMongoDBバージョン4.2.6に関するレポートで、ジェプセンは、MongoDBはバージョン3.6.4が合格したテストについてのみ言及しており、バージョン4.2.6ではより多くの問題が発生したと書いている。[ 56 ]ジェプセンのテスト概要の一部は次の通りである。
ジェプセンはMongoDBバージョン4.2.6を評価し、読み取りと書き込みのコンセンサスを最も強いレベルに設定しても、スナップショット分離を維持できないことを発見しました。ジェプセンは、読み取りスキュー、循環的な情報フロー、重複書き込み、内部一貫性違反を確認しました。弱いデフォルト設定は、トランザクションが書き込みを失い、ダーティリードを許容することを意味し、データベースレベルとコレクションレベルで要求された安全性レベルを低下させることさえあります。さらに、スナップショット読み取りコンセンサスは、読み取り専用トランザクションであっても、書き込みコンセンサスが多数決でない限り、スナップショットを保証しませんでした。これらの設計上の選択は、MongoDBトランザクションの安全な使用を複雑にしています。[ 57 ]
5月26日、ジェプセン氏は報告書を更新し、「MongoDBはトランザクション再試行メカニズムのバグを特定しました。このバグが今回の報告書で観察された異常の原因であると考えられます。パッチは4.2.8でリリースされる予定です。」と述べました。[ 57 ]この問題は4.2.8で修正され、「ジェプセン氏によるデフォルト書き込みに関する懸念も解決され、デフォルト書き込みに関する懸念はMongoDB 5.0から多数派の懸念(w:majority)に引き上げられました。」[ 58 ]