この用語をシェア
概要・定義
MongoDBは、ドキュメント指向のNoSQLデータベースで、データをJSONライクなドキュメント形式(BSON)で格納します。2009年に最初のバージョンがリリースされ、伝統的なリレーショナルデータベースとは異なり、柔軟なスキーマ、水平スケーリング、高パフォーマンスを特徴としています。モダンアプリケーション開発、特にWebアプリケーション、モバイルアプリケーション、ビッグデータ処理で幅広く使用されています。
主要な特徴・利点
1. 柔軟なスキーマ設計
伝統的なSQLデータベースとは異なり、事前に固定したスキーマを定義する必要がありません。ドキュメントごとに異なるフィールドを持つことができ、アジャイル開発や快速なプロトタイプ開発に適しています。
2. スケーラビリティとパフォーマンス
水平スケーリング(シャーディング)と垂直スケーリングの両方をサポートし、大量のデータや高トラフィックに対応できます。インメモリストレージエンジンやインデックスの最適化により、高速なデータアクセスを実現します。
3. リッチクエリ機能
アグリゲーションパイプライン、テキスト検索、地理空間クエリ、グラフルックアップなど、高度なデータ処理機能を提供します。JSONドキュメントのネストした構造を直接クエリできるため、複雑なデータ操作を簡単に実行できます。
4. 自動フェイルオーバーと高可用性
レプリカセットを使用した自動フェイルオーバー機能、データセンターを跨いだレプリケーション、バックアップとポイントインタイムリカバリ機能により、高い可用性とデータ保護を実現します。
使用例・実装方法
基本的なインストールと設定
# Ubuntu/Debianでのインストール
# MongoDBの公式リポジトリを追加
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
# パッケージリストを更新してインストール
sudo apt-get update
sudo apt-get install -y mongodb-org
# MongoDBサービスの開始
sudo systemctl start mongod
sudo systemctl enable mongod
# MongoDBシェルに接続
mongosh
基本的なデータ操作例
// データベースを選択または作成
use myapp
// ドキュメントの挿入
db.users.insertOne({
name: "John Doe",
email: "john@example.com",
age: 30,
interests: ["programming", "music", "travel"],
address: {
street: "123 Main St",
city: "Tokyo",
zipCode: "100-0001"
}
})
// ドキュメントの検索
db.users.find({ name: "John Doe" })
// 複数条件での検索
db.users.find({ age: { $gte: 25 }, interests: "programming" })
// ドキュメントの更新
db.users.updateOne(
{ name: "John Doe" },
{ $set: { age: 31 }, $push: { interests: "photography" } }
)
// ドキュメントの削除
db.users.deleteOne({ name: "John Doe" })
Node.jsでの接続例(MongoDB Driver使用)
const { MongoClient } = require('mongodb');
const uri = "mongodb://localhost:27017";
const client = new MongoClient(uri);
async function run() {
try {
await client.connect();
const database = client.db('myapp');
const collection = database.collection('users');
// ドキュメントの挿入
const user = {
name: "Jane Smith",
email: "jane@example.com",
age: 28,
interests: ["design", "art"],
createdAt: new Date()
};
const result = await collection.insertOne(user);
console.log("ドキュメントが挿入されました:", result.insertedId);
// ドキュメントの検索
const findResult = await collection.find({ age: { $gte: 25 } }).toArray();
console.log("検索結果:", findResult);
} finally {
await client.close();
}
}
run().catch(console.dir);
競合技術との比較
MongoDB vs リレーショナルデータベース(MySQL/PostgreSQL)
- MongoDB: スキーマレス、水平スケーリングに優れ、JSONデータの直接扱いが可能
- RDBMS: ACIDトランザクション、正規化、結合クエリに優れる
MongoDB vs 他のNoSQLデータベース
- MongoDB vs CouchDB: MongoDBはJavaScriptベースのクエリ、CouchDBはHTTP REST API
- MongoDB vs DynamoDB: MongoDBはオンプレミス・クラウド両方、DynamoDBはAWSマネージドサービス
- MongoDB vs Cassandra: MongoDBはドキュメント指向、Cassandraはカラムファミリー系
導入時の注意点・ベストプラクティス
1. スキーマ設計とデータモデリング
スキーマレスであるからといって、何でも自由にデータを格納するのではなく、アプリケーションのニーズに合わせた適切なデータモデルを設計することが重要です。埋め込みと参照のバランス、ドキュメントのサイズ制限等を考慮する必要があります。
2. インデックス戦略
クエリパフォーマンスを最大化するため、アプリケーションのクエリパターンに基づいて適切なインデックスを作成します。複合インデックス、テキストインデックス、地理空間インデックスなどを活用します。
3. レプリケーションとシャーディング
高可用性とスケーラビリティを実現するため、レプリカセットを構成し、必要に応じてシャーディングを実装します。シャーデキーの選択、チャンクサイズの設定、バランサーの配置などを慣重に計画します。
4. メモリ管理とリソース監視
MongoDBはメモリを大量に使用するため、システムリソースの監視と調整が重要です。WiredTigerストレージエンジンのキャッシュサイズ設定、コネクションプールの管理、スロークエリの監視を実施します。