Overview
Mongoose はノード.jsベーススキーマベースのデータ モデリング、検証、クエリ構築、ビジネス ロジック フックを提供するオブジェクト データ モデリング(ODM)ライブラリ。
ODM は、従来のSQLデータベースで使用されるオブジェクト関係マッパー(ORM)に似ていますが、MongoDB のドキュメントベースのデータモデル専用に設計されています。
Tip
Mongoose の互換性
MongooseとさまざまなMongoDBサーバーのバージョンの互換性については、 Mongooseドキュメントの「 Mongoose の互換性 」ページを参照してください。
オブジェクト データ モデリングとは
オブジェクト データ モデリング(ODM)は、アプリケーションコードとデータベースドキュメントの間に構造化された関係を作成します。MongooseなどのODMでは、MongoDBコレクションにマップし、それら内のドキュメントに構造を強制するアプリケーションレベルでスキーマを定義します。
MongoDB は、アプリケーションの進化に合わせてデータベーススキーマを変更できる柔軟なデータモデルを提供します。ただし、ユースケースによっては、コレクション内のドキュメント間でデータ構造の整合性が必要になる場合があります。
Mongoose は、次の機能を提供することで、整合性のこのニーズに対処します。
ドキュメントの構造とデータ型を定義する
コレクションと交流するためのスキーマからモデルを生成
アプリケーションレベルでデータ検証ルールを強制する
データベース操作の前後でカスタム ロジックを実行
スムーズAPIでデータベースクエリを構築、実行
他のコレクションからドキュメントを参照します(結合と同様)
スキーマの強制
Mongoose はアプリケーションレベルでスキーマを強制します。フィールド名、データ型、検証ルールなど、コレクション内の ドキュメント の構造を指定するスキーマを定義します。Mongoose は、データベース操作を実行する前に、このスキーマに対してデータを検証します。
スキーマと検証ルールは、Node.jsアプリケーションコード内にのみ存在します。MongoDBサーバー自体はこれらの制約を認識せず、アプリケーションが送信する有効なBSONドキュメントを受け入れます。
データモデリング
Mongoose、コレクションと交流する前にスキーマとモデルを定義する必要があります。この構造化されたアプローチは、関係データベースやその他の ORM の経験を持つ開発者に慣れる可能性があります。
その反面、柔軟性は低下します。データ構造を変更する必要がある場合は、Mongooseスキーマを更新する必要があります。
スキーマ検証
Mongoose は2 つの方法でデータを検証します。まず、スキーマでフィールド型を定義 して、各フィールドで許可されるデータ型を指定します。Mongoose は、定義された型と一致しないデータを挿入しようとする操作を拒否します。
次に、必須フィールド、最小値または最大値、string の長さ制約、カスタム検証関数など、特定の検証ルールを追加できます。
これらの検証ルールは、ノードアプリケーションでMongooseを使用する場合にのみ適用されます。これらのルールはアプリケーションコードにのみ存在するため、他のアプリケーションやデータベースツールをバイパスできます。
MongoDB Node.jsドライバーと MongoDB の組み込みスキーマ検証を使用してデータを検証する方法の詳細については、サーバーマニュアルのMongoDB スキーマ検証ガイドを参照してください。
複数のコレクションの操作
MongooseとMongoDB Node.jsドライバーはどちらも、関係データベースの結合と同様に、複数のコレクションのドキュメントの結合をサポートしています。
Mongooseに入力する
Mongoose は、他のコレクションからドキュメントを参照ための populate() メソッドを提供します。参照コレクションを指定して、スキーマ内で参照を定義します。ObjectId は参照に使用する一般的な型ですが、 Mongoose は文字列、数値、UUID、バッファなどの他の型の使用もサポートしています。クエリ時に、 Mongoose はこれらの参照を実際のドキュメントに自動的に置き換えることができます。
Mongoose は、複数のクエリを実行してデータ入力操作を行います。このアプローチは、大規模なスキャンを扱う場合やインデックスが欠落している場合など、特定のシナリオで役立ちます。
MongoDBの $lookup
MongoDB には、同じデータベース内のコレクション間の左外部結合と同様のアクションを実行するための $lookup集計ステージが用意されています。MongoDB Node.jsドライバーでは、集計パイプラインを介してこの機能に直接アクセスできます。
$lookup 演算子は 1 つの集計パイプライン操作として実行されます。このアプローチではパフォーマンス上の利点が得られる場合がありますが、実際のパフォーマンスは、データサイズ、使用可能なインデックス、クエリパターンなどの要因によって異なります。
Mongooseを使い始める
Mongooseのインストール、MongoDBへの接続、Mongooseスキーマとモデルを使用してCRUD操作を実行する方法については、Mongooseを使い始めるチュートリアルをご覧ください。