カスタム リゾルバの定義
項目一覧
Overview
アプリのユースケース用に GraphQL API を拡張する カスタム リゾルバ を定義できます。 カスタム リゾルバを使用すると、生成されたクエリおよびミューテーション リゾルバよりも複雑または具体的な新しいルートレベルの操作を定義できます。 また、生成されたドキュメント型に新しい計算フィールドを追加して、拡張型のドキュメントが読み取られるたびに結果を動的に評価することもできます。
手順
親型の定義
App Services は、すべてのカスタム リゾルバを親型のフィールドとして公開します。 親タイプは、 ルートレベルのクエリ、ミューテーション、または生成されたドキュメントタイプにすることができます。
[ Parent Typeドロップダウンで、次のいずれかのオプションを選択します。
オプション | 説明 | ||||
---|---|---|---|---|---|
Query | リゾルバはルートレベルの 例
| ||||
Mutation | リゾルバはルートレベルの 例
| ||||
Document Type | リゾルバは、指定されたドキュメント型の計算プロパティです。 ドキュメント型を返すクエリまたはミューテーションは、型のカスタム リゾルバによって定義された計算プロパティを要求することもできます。 例
|
入力タイプの定義
カスタム リゾルバは、受信クエリまたはミューテーションから入力パラメータを受け入れることができます。 既存の生成された入力タイプを使用することも、リゾルバ専用に新しいカスタム入力タイプを定義することもできます。
入力型を指定すると、App Services は、指定された入力型を受け入れる任意のパラメーターとして、カスタム リゾルバの生成された GraphQL スキーマ定義のinput
パラメーターを公開します。 入力タイプを指定しない場合、カスタム リゾルバは引数を受け入れません。
[ Input Typeドロップダウンで、次のいずれかのオプションを選択します。
オプション | 説明 | |||||||
---|---|---|---|---|---|---|---|---|
None | リゾルバは入力を受け入れません。 例入力を受け入れない
| |||||||
Scalar | リゾルバは、生成された GraphQL スキーマの既存のスカラー型を使用します。 2 番目のドロップダウン入力で、同じタイプの単一のスカラーまたは複数のスカラーの配列のいずれかを選択します。 例Scalar Typeオプションを使用して
| |||||||
Existing Type | リゾルバは、生成された GraphQL スキーマの既存の入力タイプを使用します。 2 番目のドロップダウン入力では、同じタイプの単一の入力オブジェクトまたは複数の入力オブジェクトの配列のいずれかを選択します。 例Existing Typeオプションを使用して
| |||||||
Custom Type | App Services は、定義したスキーマに基づいてリゾルバ専用の新しい入力型を生成します。 スキーマは、少なくとも 1 つのプロパティと、生成された入力型の一意の名前を定義する 例
|
ペイロード型の定義
すべての GraphQL リゾルバは、スキーマ内の特定のタイプに準拠するペイロードを返す必要があります。 カスタム リゾルバの場合、既存の生成されたドキュメントタイプを使用するか、リゾルバ専用に新しいカスタムペイロード型を定義するか、デフォルトのペイロードを使用できます。 Atlas App Services は、指定されたペイロード型をカスタム リゾルバの生成された GraphQL スキーマ定義に含めます。
[ Payload Typeドロップダウンで、次のいずれかのオプションを選択します。
オプション | 説明 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
DefaultPayload | リゾルバは、次の署名を持つ自動生成された
例DefaultPayloadオプションを使用する
| ||||||||||
Scalar | リゾルバは、生成された GraphQL スキーマの既存のスカラー型を使用します。 2 番目のドロップダウン入力で、同じタイプの単一のスカラーまたは複数のスカラーの配列のいずれかを選択します。 例Scalar Typeオプションを使用して
| ||||||||||
Existing Type | リゾルバは、生成された GraphQL スキーマから既存のドキュメント型を返します。 2 番目のドロップダウン入力では、単一のドキュメントタイプまたは同じタイプの複数のドキュメントの配列のいずれかを選択します。 例Existing Typeオプションを使用して Existing Typeオプションを使用して
| ||||||||||
Custom Type | App Services は、定義したスキーマに基づいてリゾルバ専用に新しいペイロード型を生成します。 スキーマは、少なくとも 1 つのプロパティと、生成された入力型の一意の名前を定義する 例という名前のペイロード型でCustom Typeオプションを使用する
|
リゾルバ 関数の定義
ユーザーがカスタム リゾルバ App Services を呼び出すと、MongoDB App Services はリゾルバ 関数を実行し、その結果を返します。この結果は、リゾルバのPayload Typeに準拠する必要があります。
Atlas App Services は、該当する場合、操作からの入力データを関数に渡します。 リゾルバがドキュメント型の計算プロパティである場合、App Services は、リゾルバが呼び出された特定のドキュメントを関数に渡します。
カスタム リゾルバ 関数には、入力を受け入れるかどうかに応じて、次の 2 つの可能な署名のいずれかがあります。
exports = function myCustomResolver(input, source) { // The `input` parameter that contains any input data provided to the resolver. // The type and shape of this object matches the resolver's input type. const { someArgument } = input; // If the resolver is a computed property, `source` is the parent document. // Otherwise `source` is undefined. const { _id, name } = source; // The return value must conform to the resolver's configured payload type return { "someValue": "abc123", }; }
exports = function myCustomResolver(source) { // If the resolver is a computed property, `source` is the parent document. // Otherwise `source` is undefined. const { _id, name } = parent; // The return value must conform to the resolver's configured payload type return { "someValue": "abc123", }; }
リゾルバ 関数を定義するには、 Functionドロップダウンをクリックして、既存の関数を選択するか、新しい関数を作成します。
カスタム リゾルバの例
Scenario & Schemas
営業チームが特定の期間におけるさまざまな統計やその他のパフォーマンス メトリクスを表示するために使用する仮想ダッシュボードを考えてみましょう。 ダッシュボードは、このセクションのカスタム リゾルバを使用して、特定のユースケースの一部を処理します。
は、次のスキーマを持つすべての参照Sale
ドキュメントを解決します。
type Sale { _id: ObjectId! customer_id: String! year: String! month: String! saleTotal: Float! notes: [String] }
{ "title": "Sale", "bsonType": "object", "required": ["_id", "customer_id", "year", "month", "saleTotal"], "properties": { "_id": { "bsonType": "objectId" }, "customer_id": { "bsonType": "string" }, "year": { "bsonType": "string" }, "month": { "bsonType": "string" }, "saleTotal": { "bsonType": "decimal" }, "notes": { "bsonType": "array", "items": { "bsonType": "string" } } } }
カスタムクエリリゾルバ
営業チームの仮想ダッシュボードでは、特定の月の集計販売データを返すカスタム クエリ リゾルバが使用されています。
Atlas App Services は、リゾルバのカスタム入力型とペイロード型のスキーマ定義を生成し、リゾルバをその親型であるルートレベルのQuery
に追加します。
type Query { averageSaleForMonth(input: AverageSaleForMonthInput): AverageSaleForMonthPayload } input AverageSalesForMonthInput { month: String!; year: String!; } type AverageSaleForMonthPayload { month: String!; year: String!; averageSale: Float!; }
構成
リゾルバは、次の構成を使用します。
オプション | 説明 | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parent Type | Query | |||||||||||||||||||||||
GraphQL Field Name | averageSaleForMonth | |||||||||||||||||||||||
Input Type | カスタムタイプ:
| |||||||||||||||||||||||
Payload Type | カスタムタイプ:
| |||||||||||||||||||||||
Function |
|
使用例
このカスタム クエリを呼び出すには、次の操作と変数を使用できます。
query GetAverageSaleForMonth($averageSaleInput: AverageSaleForMonthInput!) { averageSaleForMonth(input: $averageSaleInput) { month year averageSale } }
{ "variables": { "averageSaleInput": { month: "March", year: "2020" } } }
カスタム ミューテーション
営業チームの仮想ダッシュボードでは、 _id
によって識別される特定のSale
ドキュメントに string ノートを追加するカスタム ミューテーション リゾルバが使用されています。
Atlas App Services はリゾルバのカスタム入力型のスキーマ定義を生成し、その親型であるルートレベルのMutation
にリゾルバを追加します。
type Mutation { addNoteToSale(input: AddNoteToSaleInput): Sale } input AddNoteToSaleInput { sale_id: ObjectId!; note: String!; }
構成
リゾルバは、次の構成を使用します。
オプション | 説明 | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parent Type | Mutation | ||||||||||||||||||||||||
GraphQL Field Name | addNoteToSale | ||||||||||||||||||||||||
Input Type | カスタムタイプ:
| ||||||||||||||||||||||||
Payload Type | 既存のタイプ:
| ||||||||||||||||||||||||
Function |
|
使用例
このカスタム クエリを呼び出すには、次の操作と変数を使用できます。
mutation AddNoteToSale($addNoteToSaleInput: AddNoteToSaleInput) { addNoteToSale(input: $addNoteToSaleInput) { _id customer_id month year saleTotal notes } }
{ "variables": { "addNoteToSaleInput": { "sale_id": "5f3c2779796615b661fcdc25", "note": "This was such a great sale!" } } }
計算されたプロパティ
営業チームの仮想ダッシュボードでは、各Sale
ドキュメントに新しい計算プロパティを追加するカスタム リゾルバが使用されています。 特定のSale
の計算フィールドが操作でリクエストされると、リゾルバは外部システムをクエリし、関連付けられているカスタマーが提出したサポートケースを返します。
App Services はリゾルバのカスタムペイロード型のスキーマ定義を生成し、その親型であるSale
にリゾルバを追加します。
type Sale { _id: ObjectId! customer_id: String! year: String! month: String! saleTotal: Float! notes: [String] customerSupportCases: [CustomerSupportCase] } type CustomerSupportCase { caseId: String! description: String! }
構成
リゾルバは、次の構成を使用します。
オプション | 説明 | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parent Type | Sale | ||||||||||||||||||||||||||
GraphQL Field Name | customerSupportCases | ||||||||||||||||||||||||||
Input Type | なし | ||||||||||||||||||||||||||
Payload Type | カスタムタイプ:
| ||||||||||||||||||||||||||
Function |
|
使用例
このカスタム計算プロパティを使用するには、次の操作を実行します。
query GetSalesWithSupportCases { sales { _id customer_id year month saleTotal notes customerSupportCases { caseId description } } }