最新のスケーラブルな Web アプリケーションを構築するには、柔軟性と応答性が必要です。 これを実現する強力な組み合わせは、GraphQL と MongoDB の統合です。 GraphQL の効率的なクエリは MongoDB の NoSQL 構造を完全に補完し、迅速なリアルタイムのデータ取得と複雑なデータ関係の管理を必要とするアプリケーションにとって理想的なスタックを作成します。
このガイドでは、スキーマ定義に Mongoose などのライブラリを使用した MongoDB と GraphQL サーバーの統合について詳しく説明し、大規模なデータセットのパフォーマンスの最適化について説明します。 また、MongoDB 上に構築されたスケーラブルな GraphQL API の設計上の重要な考慮事項についても説明します。
目次
1. GraphQL と MongoDB: 概要
GraphQL は、ユーザー定義の型システムを使用する API のクエリ言語およびランタイム環境です。 データのオーバーフェッチやアンダーフェッチを引き起こす可能性がある REST API とは異なり、GraphQL を使用すると、クライアントは必要なデータを正確に指定できるため、ネットワークのオーバーヘッドが最小限に抑えられ、効率が向上します。
NoSQL データベースである MongoDB は、柔軟な JSON のような形式 (BSON) でデータを保存します。 水平方向のスケーラビリティにより、大量の非構造化データまたは半構造化データに適しています。
MongoDB と GraphQL を組み合わせることで、柔軟で高性能なデータ アクセス レイヤーが作成されます。 MongoDB の動的スキーマにより、GraphQL による効率的なデータの取得と変更が可能になり、スケーラブルなアプリケーションにとって最優先の選択肢となります。
2. MongoDB と Mongoose のセットアップ
統合する前に、MongoDB と Mongoose をセットアップする必要があります。
ステップ 1: 依存関係のインストール
npm または Yarn を使用して必要なパッケージをインストールします:
<code class="language-bash">npm install express graphql express-graphql mongoose</code>
ステップ 2: MongoDB と Mongoose を接続する
Node.js アプリケーションで MongoDB を Mongoose に接続します:
<code class="language-javascript">const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/yourDB', { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => console.log('MongoDB connected')) .catch((err) => console.log('Error connecting to MongoDB:', err));</code>
忘れずに mongodb://localhost:27017/yourDB
を MongoDB 接続文字列に置き換えてください。
3. GraphQL スキーマと型の定義
重要なステップは、MongoDB コレクションにマップする GraphQL スキーマと型を定義することです。
ステップ 1: Mongoose モデルの定義
MongoDB コレクションを表す Mongoose モデルを作成します。
<code class="language-bash">npm install express graphql express-graphql mongoose</code>
ステップ 2: GraphQL タイプの定義
GraphQLObjectType
を使用して対応する GraphQL タイプを作成します:
<code class="language-javascript">const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/yourDB', { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => console.log('MongoDB connected')) .catch((err) => console.log('Error connecting to MongoDB:', err));</code>
ステップ 3: ルート クエリの作成
RootQuery
や find()
などの Mongoose メソッドを使用して GraphQL の findById()
を定義し、MongoDB をクエリします。
<code class="language-javascript">const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ name: String, email: String, age: Number, }); const User = mongoose.model('User', UserSchema);</code>
4. GraphQL
を使用した MongoDB へのクエリスキーマを設定すると、MongoDB と対話するための GraphQL クエリを定義できます。 たとえば、ユーザーを取得する場合:
<code class="language-javascript">const { GraphQLObjectType, GraphQLString, GraphQLInt } = require('graphql'); const UserType = new GraphQLObjectType({ name: 'User', fields: { id: { type: GraphQLString }, name: { type: GraphQLString }, email: { type: GraphQLString }, age: { type: GraphQLInt }, }, });</code>
これにより、すべてのユーザーが取得され、id
、name
、email
、および age
が表示されます。
大規模なデータセットのクエリの最適化
大規模なデータセットの場合、パフォーマンスのためにはページネーションと並べ替えが不可欠です。
ページネーションの例
<code class="language-javascript">const { GraphQLObjectType, GraphQLSchema, GraphQLList } = require('graphql'); const UserType = require('./models/UserType'); const User = require('./models/User'); const RootQuery = new GraphQLObjectType({ name: 'RootQueryType', fields: { users: { type: new GraphQLList(UserType), resolve(parent, args) { return User.find(); }, }, user: { type: UserType, args: { id: { type: GraphQLString } }, resolve(parent, args) { return User.findById(args.id); }, }, }, });</code>
ページネーションはクエリごとのレコードを制限し、データ ページ間のナビゲーションを可能にします。
5.ミューテーション: データ変更の管理
GraphQL ミューテーションにより、MongoDB でのデータ変更 (作成、更新、削除) が可能になります。
ステップ 1: ユーザーを作成するためのミューテーションを定義する
<code class="language-graphql">query { users { id name email age } }</code>
ステップ 2: 更新と削除にミューテーションを使用する
ユーザーの更新と削除にも同様のミューテーションを定義できます。
<code class="language-javascript">users: { type: new GraphQLList(UserType), args: { limit: { type: GraphQLInt }, page: { type: GraphQLInt }, }, resolve(parent, args) { return User.find() .skip(args.page * args.limit) .limit(args.limit); }, }</code>
6.広範なデータセットのパフォーマンスの最適化
大規模な MongoDB データセットの場合は、次の最適化を検討してください。
UserSchema.index({ name: 1 });
populate
メソッドを使用します。 User.find().populate('posts').exec();
7. GraphQL と MongoDB の統合のベスト プラクティス
8.結論
GraphQL を MongoDB と統合すると、アプリケーションのパフォーマンスとスケーラビリティが大幅に向上します。 MongoDB の柔軟性と GraphQL の効率的なクエリを組み合わせることで、複雑なデータ関係を処理できる高速で堅牢なアプリケーションを構築できます。 ベスト プラクティスに従ってパフォーマンスを最適化すると、大規模なデータセットでもアプリケーションの応答性が維持されます。
(FAQ および関連ブログのセクションは、すでに提供されている情報のほとんどが重複しているため、簡潔にするために省略されています。)
以上がスケーラブルなアプリのために GraphQL を MongoDB と統合する方法 |ブログの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。