Overview
プリズマは、 Node.js用のオープンソースのオブジェクト関係マッパー(ORM)です。 JavaScriptとTypescript の両方をサポートしていますが、読み取り可能で型安全なコードを書込むためにTypescriptと主に使用されます。
警告
Prisma ORM v7 の MongoDB サポート
MongoDB Node.jsドライバーはまだPrisma ORM バージョン 7 をサポートしていません。MongoDBを使用する場合は、Prisma ORM の利用可能な最新バージョン 6.x リリースを使用します。
Schemas
スキーマは、コレクションのドキュメントの構造を定義することで、開発者が時間の経過とともにデータの不整合を回避するのに役立ちます。MongoDB内ではデータベースレベルでスキーマを定義できますが、 プリズマ を使用するとアプリケーションレベルでスキーマを定義できます。 プリズマ Client はスキーマを認識しているため、 プリズマ Client を使用する開発者はクエリをオートコンプリートするアクセス権を持ちます。
データモデリング
一般に、まとめてアクセスされるデータは、 MongoDBコレクションにまとめて保存する必要があります。プリズマ は、埋め込みドキュメントを使用してデータを保持することをサポートしています。 関連データを別々のMongoDBコレクションに保存する必要があるユースケースでは、あるドキュメントの _idフィールドを別のドキュメントに含める必要があります。プリズマ はこのプロセスを効率化し、データの参照整合性を維持すると同時に、この関連データの整理を支援します。
参照を使用してコレクション間の関係をモデル化する場合、Prisma スキーマに @relation 属性を追加して、Prisma クライアントがそれらの関係にアクセスし、参照アクションをエミュレートして、参照の整合性を維持できるようにします。
MongoDBでの効率的なデータ モデリングの詳細については、 MongoDB Serverマニュアルの $lookup 操作の削減 を参照してください。
スキーマ イントロスペクション
MongoDBにはデフォルトのフレキシブルなスキーマがあります。prisma db pull コマンドを使用して既存のMongoDBデータベースを内部検証すると、Prismaは各コレクションから最大 1000 のランダムなドキュメントをサンプルしてスキーマ構造を推測します。
ドキュメント間でデータ型が一致しないフィールドがコレクションに含まれる場合、PrismaはそれらのフィールドをJsonタイプにマッピングし、警告を出力します。これにより、既存のすべてのデータを読み取ることができますが、型の安全性の利点は低下します。これを解決するには、コンシステントなタイプを使用するようにデータを手動で更新し、prisma db pull を再度実行することで、適切なタイプ定義でスキーマを再生成します。詳細については、型競合のトラブルシューティングを参照してください。
Tutorial
このチュートリアルでは、次のアクションを実行する方法について説明します。
プリズマアプリケーションの例をダウンロード
プリズマスキーマを設定する
MongoDBデータベースを作成し、サンプルデータを入力する
例アプリケーションをMongoDBと互換性を持たせるために
アプリケーションを実行する
前提条件を確認します
このチュートリアルを開始する前に、次のコンポーネントが準備されていることを確認してください。
構成されたクラスターを持つMongoDB Atlasアカウント。手順を表示するには、MongoDB Get Started ガイドを参照してください。
Node.js v16.20.1以降に更新します。
例アプリケーションをダウンロード
プリズマ例リポジトリから例アプリケーションを複製またはダウンロードします。
この例では、 SQLiteデータベースを使用する単純なブログ コンテンツ管理プラットフォームです。次の手順では、SQLite の代わりにMongoDBを使用するようにアプリケーションを変更します。
プリズマスキーマを設定する
例アプリケーションディレクトリ内の prisma/schema.prismaファイルに移動します。このファイルの datasource dbオブジェクトで、providerフィールドを "mongodb" に設定し、urlフィールドをAtlas 接続 URI に設定します。
同じファイルの User モデルで、idフィールドタイプを Int から String に変更し、デフォルト値を auto() に設定します。idプロパティはMongoDB _idフィールドにマッピングする必要があります。このプロパティのデータ型を ObjectId に設定するようにプリズマを指示する必要があります。
Post モデルで、User モデルで実行したのと同じ変更を idフィールドに実行します。また、authorIdフィールドタイプを Int から String に変更し、データ型をObjectId に設定する必要があります。
schema.prismaファイルは次のようになります。
generator client { provider = "prisma-client-js" } datasource db { provider = "mongodb" url = "<your connection URI>" } model Post { id String (auto()) ("_id") .ObjectId createdAt DateTime (now()) updatedAt DateTime title String content String? published Boolean (false) viewCount Int (0) author User (fields: [authorId], references: [id]) authorId String .ObjectId } model User { id String (auto()) ("_id") .ObjectId email String name String? posts Post[] }
このスキーマは、 MongoDBデータベース内に個別の User コレクションと Post コレクションを定義します。各 Post には User への参照が含まれています。
これらの変更を加えたら、ターミナルのプロジェクトディレクトリに移動し、次のコマンドを実行して必要な依存関係をインストールし、スキーマを生成します。
npm install npx prisma generate
注意
スキーマにさらに変更を加える場合、変更を有効にするには npx prisma generate コマンドを再実行する必要があります。
型競合のトラブルシューティング
MongoDBコレクションに、ドキュメント間で一貫性のないデータ型を使用するフィールドが含まれている場合、スキーマに期待される型と一致しないデータをクエリすると、Prisma クライアントはエラーをスローする可能性があります。
これに対処するために、次のアクションを実行できます。
prisma db pullを実行した後にPrismaスキーマの警告とコメントを検討し、競合するタイプを使用するフィールドを特定します。コレクション内のすべてのドキュメントでコンシステントなタイプを使用するようにデータを更新。
prisma db pullを再度実行するして、修正されたタイプを含むスキーマを再生成します。
あるいは、柔軟性を維持する必要がある場合は、フィールドをタイプ Json のままにすることもできます。ただし、これによりPrismaが提供する型の安全性の利点が低下します。
追加リソース
プリズマの詳細については、プリズマ のドキュメント を参照してください。
このチュートリアルのアプリケーションの完全なバージョンを表示およびダウンロードするには、 presma-mongodb-nextjs-example Githubリポジトリ を参照してください。