Docs Menu
Docs Home
/ /
Atlas App Services
/ /

カスタム リゾルバの定義

項目一覧

  • Overview
  • 手順
  • 新しいカスタム リゾルバの作成
  • リゾルバ フィールド名の定義
  • 親型の定義
  • 入力タイプの定義
  • ペイロード型の定義
  • リゾルバ 関数の定義
  • リゾルバの保存と配置
  • カスタム リゾルバの例
  • Scenario & Schemas
  • カスタムクエリリゾルバ
  • カスタム ミューテーション
  • 計算されたプロパティ

アプリのユースケース用に GraphQL API を拡張する カスタム リゾルバ を定義できます。 カスタム リゾルバを使用すると、生成されたクエリおよびミューテーション リゾルバよりも複雑または具体的な新しいルートレベルの操作を定義できます。 また、生成されたドキュメント型に新しい計算フィールドを追加して、拡張型のドキュメントが読み取られるたびに結果を動的に評価することもできます。

1

App Services UI で、ナビゲーション サイドバーの [ GraphQLをクリックし、[ Custom Resolvers ] タブを選択します。

[ Add a Custom Resolverボタンをクリックして、新しいカスタム リゾルバの構成画面を開きます。

App Services UI のカスタム リゾルバ画面
2

GraphQL Field Name入力のリゾルバの App Services 名を指定します。 App Services は、この名前を使用して親型でカスタム リゾルバを公開するため、名前は GraphQL API を扱う開発者に役立つ方法でリゾルバの動作を説明する必要があります。

3

App Services は、すべてのカスタム リゾルバを親型のフィールドとして公開します。 親タイプは、 ルートレベルのクエリミューテーション、または生成されたドキュメントタイプにすることができます。

[ Parent Typeドロップダウンで、次のいずれかのオプションを選択します。

オプション
説明
Query

リゾルバはルートレベルの query操作です。

myCustomQueryという名前のクエリのカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery: DefaultPayload
...
}
Mutation

リゾルバはルートレベルのmutation操作です。

myCustomMutationという名前のミューテーションのカスタム リゾルバには、次の生成されたスキーマがあります。

type Mutation {
myCustomMutation: DefaultPayload
...
}
Document Type

リゾルバは、指定されたドキュメント型の計算プロパティです。 ドキュメント型を返すクエリまたはミューテーションは、型のカスタム リゾルバによって定義された計算プロパティを要求することもできます。

myCustomTaskPropertyという名前のTask型の計算プロパティを定義するカスタム リゾルバには、次の生成されたスキーマがあります。

type Task {
myCustomTaskProperty: DefaultPayload
...
}
4

カスタム リゾルバは、受信クエリまたはミューテーションから入力パラメータを受け入れることができます。 既存の生成された入力タイプを使用することも、リゾルバ専用に新しいカスタム入力タイプを定義することもできます。

入力型を指定すると、App Services は、指定された入力型を受け入れる任意のパラメーターとして、カスタム リゾルバの生成された GraphQL スキーマ定義のinputパラメーターを公開します。 入力タイプを指定しない場合、カスタム リゾルバは引数を受け入れません。

[ Input Typeドロップダウンで、次のいずれかのオプションを選択します。

オプション
説明
None

リゾルバは入力を受け入れません。

入力を受け入れないmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery: DefaultPayload
...
}
Scalar

リゾルバは、生成された GraphQL スキーマの既存のスカラー型を使用します。

2 番目のドロップダウン入力で、同じタイプの単一のスカラーまたは複数のスカラーの配列のいずれかを選択します。

Scalar Typeオプションを使用してDateTiemの入力型を指定するmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery(input: DateTime): DefaultPayload
...
}
Existing Type

リゾルバは、生成された GraphQL スキーマの既存の入力タイプを使用します。

2 番目のドロップダウン入力では、同じタイプの単一の入力オブジェクトまたは複数の入力オブジェクトの配列のいずれかを選択します。

Existing Typeオプションを使用してTaskInsertInputの入力型を指定するmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery(input: TaskInsertInput): DefaultPayload
...
}
Custom Type

App Services は、定義したスキーマに基づいてリゾルバ専用の新しい入力型を生成します。 スキーマは、少なくとも 1 つのプロパティと、生成された入力型の一意の名前を定義するtitleフィールドを含むobjectである必要があります。

カスタム入力型の カスタム リゾルバ 構成。

MyCustomQueryInputという名前の入力タイプでCustom Typeオプションを使用するmyCustomQueryというカスタム リゾルバには、次の生成されたスキーマがあります。

input MyCustomQueryInput {
someArgument: String;
}
type Query {
myCustomQuery(input: MyCustomQueryInput): DefaultPayload
...
}
5

すべての GraphQL リゾルバは、スキーマ内の特定のタイプに準拠するペイロードを返す必要があります。 カスタム リゾルバの場合、既存の生成されたドキュメントタイプを使用するか、リゾルバ専用に新しいカスタムペイロード型を定義するか、デフォルトのペイロードを使用できます。 Atlas App Services は、指定されたペイロード型をカスタム リゾルバの生成された GraphQL スキーマ定義に含めます。

[ Payload Typeドロップダウンで、次のいずれかのオプションを選択します。

オプション
説明
DefaultPayload

リゾルバは、次の署名を持つ自動生成されたDefaultPayload型を返します。

type DefaultPayload {
status: String!
}

statusフィールドは、リゾルバ 関数の戻り値に関係なく、常に"complete"に解決されます。

{
status: "complete"
}

DefaultPayloadオプションを使用するmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery: DefaultPayload
...
}
Scalar

リゾルバは、生成された GraphQL スキーマの既存のスカラー型を使用します。

2 番目のドロップダウン入力で、同じタイプの単一のスカラーまたは複数のスカラーの配列のいずれかを選択します。

Scalar Typeオプションを使用してDateTimeのペイロード型を指定するmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery: DateTime
...
}
Existing Type

リゾルバは、生成された GraphQL スキーマから既存のドキュメント型を返します。

2 番目のドロップダウン入力では、単一のドキュメントタイプまたは同じタイプの複数のドキュメントの配列のいずれかを選択します。

Existing Typeオプションを使用してTaskInsertInputの入力型を指定するmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

Existing Typeオプションを使用して[Task]のペイロード型を指定するmyCustomQueryという名前のカスタム リゾルバには、次の生成されたスキーマがあります。

type Query {
myCustomQuery: [Task]
...
}
Custom Type

App Services は、定義したスキーマに基づいてリゾルバ専用に新しいペイロード型を生成します。 スキーマは、少なくとも 1 つのプロパティと、生成された入力型の一意の名前を定義するtitleフィールドを含むobjectである必要があります。

新しいカスタムペイロード型を定義する カスタム リゾルバ 構成。

という名前のペイロード型でCustom Typeオプションを使用するmyCustomQuery MyCustomQueryPayload名前のカスタム リゾルバには、次の生成されたスキーマがあります。

input MyCustomQueryPayload {
someValue: String;
}
type Query {
myCustomQuery: MyCustomQueryPayload
...
}
6

ユーザーがカスタム リゾルバ 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ドロップダウンをクリックして、既存の関数を選択するか、新しい関数を作成します。

7

リゾルバを設定したら、[ Save ] をクリックしてアプリケーションを配置します。 配置が完了すると、GraphQL API を通じてカスタム リゾルバを呼び出せるようになります。

営業チームが特定の期間におけるさまざまな統計やその他のパフォーマンス メトリクスを表示するために使用する仮想ダッシュボードを考えてみましょう。 ダッシュボードは、このセクションのカスタム リゾルバを使用して、特定のユースケースの一部を処理します。

は、次のスキーマを持つすべての参照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

カスタムタイプ: AverageSaleForMonthInput

{
"bsonType": "object",
"title": "AverageSaleForMonthInput",
"required": ["month", "year"],
"properties": {
"month": {
"bsonType": "string"
},
"year": {
"bsonType": "string"
}
}
}
input AverageSalesForMonthInput {
month: String!;
year: String!;
}
Payload Type

カスタムタイプ: AverageSaleForMonthPayload

{
"bsonType": "object",
"title": "AverageSaleForMonthPayload",
"required": ["month", "year", "averageSale"],
"properties": {
"month": {
"bsonType": "string"
},
"year": {
"bsonType": "string"
},
"averageSale": {
"bsonType": "decimal"
}
}
}
type AverageSaleForMonthPayload {
month: String!;
year: String!;
averageSale: Float!;
}
Function
exports = async function averageSaleForMonth({ month, year }) {
const cluster = context.services.get("mongodb-atlas");
const sales = cluster.db("corp").collection("sales");
const averageSalePayload = await sales
.aggregate([
{ $match: { month: month, year: year } },
{
$group: {
_id: { month: "$month", year: "$year" },
averageSale: { $avg: "$saleTotal" },
}
},
{
$project: {
month: "$_id.month",
year: "$_id.year",
averageSale: 1
}
}
])
.next();
return averageSalePayload;
};

このカスタム クエリを呼び出すには、次の操作と変数を使用できます。

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

カスタムタイプ: AddNoteToSaleInput

{
"bsonType": "object",
"title": "AddNoteToSaleInput",
"required": ["sale_id", "note"],
"properties": {
"sale_id": {
"bsonType": "objectId"
},
"note": {
"bsonType": "string"
}
}
}
input AddNoteToSaleInput {
sale_id: ObjectId!;
note: String!;
}
Payload Type

既存のタイプ: 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" }
}
}
}
Function
exports = async function addNoteToSale({ sale_id, note }) {
const cluster = context.services.get("mongodb-atlas");
const sales = cluster.db("corp").collection("sales");
const sale = await sales.findOneAndUpdate(
{ _id: sale_id },
{ $push: { notes: note } },
{ returnNewDocument: true }
);
return sale;
}

このカスタム クエリを呼び出すには、次の操作と変数を使用できます。

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

カスタムタイプ: [CustomerSupportCase]

{
"bsonType": "array",
"items": {
"title": "CustomerSupportCase",
"bsonType": "object",
"required": ["caseId", "description"],
"properties": {
"caseId": { "bsonType": "string" },
"description": { "bsonType": "string" }
}
}
}
type CustomerSupportCase {
caseId: String!
description: String!
}
type Sale {
_id: ObjectId!
customer_id: String!
year: String!
month: String!
saleTotal: Float!
notes: [String]
customerSupportCases: [CustomerSupportCase]
}
Function
exports = async function customerSupportCases(sale) {
// Return a list of objects from some external system
const cases = await fetchCustomerSupportCases({
customerId: sale.customer_id
});
return cases;
};

このカスタム計算プロパティを使用するには、次の操作を実行します。

query GetSalesWithSupportCases {
sales {
_id
customer_id
year
month
saleTotal
notes
customerSupportCases {
caseId
description
}
}
}

戻る

GraphQL の型、リゾルバ、演算子