📌
MongoDBを触る機会があったためキャッチアップした
MongoDBのデータ構造
MongoDBの書き方
MongoDBでは、JavaScript形式のクエリを用いてデータの操作を行います。たとえば:
// ドキュメントの挿入
db.users.insertOne({ name: 'Alice', age: 25 });
// データの検索
db.users.find({ age: { $gt: 30 } });
// データの更新
db.users.updateOne({ name: 'Alice' }, { $set: { age: 26 } });
// データの削除
db.users.deleteMany({ age: { $lt: 20 } });
SQLとMQLの比較
操作 | SQL | MongoDB (MQL) |
---|---|---|
データ取得 | SELECT * FROM users WHERE age > 30; |
db.users.find({ age: { $gt: 30 } }) |
データ追加 | INSERT INTO users (name, age) VALUES ('Alice', 25); |
db.users.insertOne({ name: 'Alice', age: 25 }) |
データ更新 | UPDATE users SET age = 26 WHERE name = 'Alice'; |
db.users.updateOne({ name: 'Alice' }, { $set: { age: 26 } }) |
データ削除 | DELETE FROM users WHERE age < 20; |
db.users.deleteMany({ age: { $lt: 20 } }) |
アーキテクチャ、利点と欠点
MongoDBを使う理由
1. 柔軟なデータモデル
MongoDBの最大の強みの一つは、構造化データと非構造化データの両方を簡単に保存できることです。スキーマレス設計により、同じコレクション内で異なる構造を持つドキュメントを混在させることができます。これにより:
- アプリケーションの要件変更に迅速に対応できる
- データモデルを事前に厳密に定義する必要がない
- プロトタイピングや反復開発がスムーズに進む
2. JSON形式のドキュメント
MongoDBはJSONに類似したBSON形式でデータを保存します:
{
"_id": ObjectId("5f8a716b9d3b82c86a149c28"),
"title": "MongoDB入門",
"author": {
"name": "山田太郎",
"email": "yamada@example.com"
},
"tags": ["NoSQL", "データベース", "入門"],
"comments": [
{ "user": "鈴木一郎", "text": "わかりやすい記事でした" },
{ "user": "佐藤花子", "text": "勉強になりました" }
]
}
この形式は:
- 多くの開発者に馴染みがある
- 直感的なデータ表現が可能
- ネストされたオブジェクトや配列をそのまま表現できる
3. 優れたスケーラビリティ
MongoDBは大容量のデータを効率的に扱うために設計されています:
- 垂直スケーリング: より強力なハードウェアにアップグレード
- 水平スケーリング: シャーディングによる複数サーバーへのデータ分散
- 高いスループットと低レイテンシーを維持したまま拡張可能
MongoDBの問題点
1. SQLが使えない
従来のRDBMSに慣れた開発者には学習曲線があります:
- JavaScript形式のクエリ言語(MongoDB Query Language)
- SQLの知識が直接活かせない
- 複雑なクエリの構築方法が異なる
2. 高度な結合操作の制限
- RDBMSのような複雑な結合(JOIN)操作が困難
- 複数コレクション間のデータ結合には$lookupなどを使用するが、パフォーマンス面で課題がある
- 多対多の関係を扱う場合の設計が複雑になりがち
3. 複雑なトランザクション
- 多重トランザクション処理が煩雑
- バージョン4.0以前ではドキュメントレベルの原子性しか保証されていなかった
- 複数ドキュメントにまたがるトランザクション処理の実装が複雑
MongoDBに向いているアプリケーション
1. データ構造に柔軟性が求められるアプリケーション
コンテンツ管理システム (CMS)
- 様々な形式のコンテンツを扱う必要がある
- コンテンツタイプごとに異なるスキーマが必要
- ドキュメント構造の柔軟な変更が頻繁に発生する
カタログアプリケーション
- 異なる属性を持つ商品データを統一的に管理
- 階層的なデータ構造(カテゴリ、サブカテゴリなど)に適している
- 商品属性の追加・変更が容易
2. スケーラビリティが重要なアプリケーション
IoTアプリケーション
- 大量のセンサーデータをリアルタイムで保存・処理
- 水平スケーリングによるデータ量増加への対応
- データの時系列的な保存と集計が必要
ゲームアプリケーション
- プレイヤーデータの迅速な更新・取得が必要
- ユーザー数の急増にも柔軟に対応できる水平スケーリング
- 複雑なゲーム状態データの保存に適したドキュメント構造
3. 高いパフォーマンスが必要なアプリケーション
リアルタイム分析
- 高スループットの読み書き処理
- アグリゲーションフレームワークによる複雑な分析クエリ
- 大量データの集計・処理能力
モバイルアプリケーション
- オフライン同期の容易さ
- 迅速なデータアクセスと変更
- スキーマレス設計による柔軟な開発
4. MongoDBのアーキテクチャを活かせるその他の特徴
頻繁なスキーマ変更が必要
- アジャイル開発での迅速な反復
- プロトタイピングや実験的なアプリケーション
- 進化するビジネス要件への対応
ドキュメント指向のデータ構造に適合
- 一対多の関係を単一ドキュメントで表現できる
- 埋め込みドキュメントによる関連データのまとめ
- 非正規化されたデータモデルが適している
読み取り操作が多い
- レプリカセットを活用した読み取りスケーリング
- インデックスの効果的な活用が可能
- キャッシュフレンドリーなデータアクセスパターン
分散システムの恩恵を受ける
- 地理的に分散したシステム
- 高可用性が求められるミッションクリティカルなアプリケーション
- 災害復旧機能を必要とするシステム
MongoDBのアーキテクチャ基礎
MongoDBは、柔軟性と拡張性に優れたNoSQLデータベースです。そのアーキテクチャには以下の主要な要素があります:
1. ドキュメント指向データモデル
MongoDBはドキュメント指向データベースであり、データはJSONに似たBSON(Binary JSON)形式で保存されます。
- ドキュメント:フィールドと値のペアで構成された基本的なデータ単位
- コレクション:ドキュメントのグループ(RDBMSのテーブルに相当)
- データベース:コレクションのコンテナ
2. レプリケーション(複製)
データの高可用性を確保するために、MongoDBはレプリカセットと呼ばれる仕組みを使用します。
- プライマリノード:読み取りと書き込みの両方を処理する主要なサーバー
- セカンダリノード:プライマリからデータを複製し、読み取り操作を処理(通常2つ以上)
- 自動フェイルオーバー:プライマリが失敗した場合、セカンダリが自動的に新しいプライマリに選出される
3. シャーディング(水平スケーリング)
大量のデータと高いスループットを処理するため、MongoDBはデータを複数のマシンに分散させます。
- シャード:データの一部を保持する個別のレプリカセット
- シャードキー:データを分散させるために使用される特定のフィールド
- チャンク:シャード間で移動可能なデータの小さなブロック
4. クエリ処理と管理
MongoDBは分散環境での効率的なクエリ処理と管理を実現するため、以下のコンポーネントを提供します。
- mongos:クライアントアプリケーションとシャードクラスタ間のインターフェースとして機能するルーター
- Config Servers:クラスターのメタデータとシャード構成情報を保持
5. ストレージエンジン
MongoDBのストレージエンジンには、デフォルトでWiredTigerが使用されます(バージョン3.2以降)。
-
WiredTigerの特徴:
- ドキュメントレベルの並行制御:複数のクライアントが同時に異なるドキュメントを変更可能
- 圧縮:データとインデックスの両方を圧縮し、ストレージ効率を向上
参考サイト
Discussion