GraphQL の型、リゾルバ、演算子
項目一覧
Overview
Atlas App Services は、定義されたスキーマを持つコレクションに対して GraphQL スキーマを自動的に生成します。各コレクションに対して、App Services は次のものを生成します。
注意
コレクション スキーマの例
このページには、 movies
コレクションの次のスキーマに基づいて生成された値を示す例が含まれています。
{ "title": "Movie", "required": ["title"], "properties": { "_id": { "bsonType": "objectId" }, "title": { "bsonType": "string" }, "year": { "bsonType": "int" }, "rated": { "bsonType": "string" }, "runtime": { "bsonType": "int" }, "director": { "bsonType": "string" }, "reviews": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "cast": { "bsonType": "array", "items": { "bsonType": "string" } } } }
スカラー型
App Services は、すべての標準 GraphQL スカラー型 をサポートしており、ObjectId
スカラーも生成します。
次のスカラー型がサポートされています。
ドキュメントの種類
App Services は、コレクション スキーマに基づいて、コレクション内のドキュメントに対して単一のGraphQL 型を生成します。このは、スキーマの title
フィールドに設定されている名前を使用するか、title
が指定されていない場合はコレクション名を使用します。
type Movie { _id: ObjectId title: String! year: Int rated: String runtime: Int director: String cast: [String] }
フィールド マッピング
App Services は、コレクション スキーマのフィールドを GraphQL 型のフィールドに直接マッピングしようとします。GraphQL 仕様で説明されている有効な名前の定義 は、有効なドキュメント フィールド名がすべてサポートされているわけではないため、App Services では、生成された GraphQL 型のフィールド名を決定するために次の変換ルールを適用します。
サポートされていない文字の削除
先頭の数字を取り除く
キャメルケースに変換する
二重アンダースコアで始まるフィールドを省略します(例:
__myField
)
BSON 型マッピング
GraphQL 型システムは、スキーマで使用できる BSON types と似ていますが、同一ではありません。App Services は、スキーマ内の BSON types とサポートされている GraphQL 型との間のマップを自動的に試行します。フィールドの種類に同等の GraphQL がない場合、App Services は生成された GraphQL ドキュメントの種類にフィールドを含めません。
次の表に、スキーマで使用できる BSON types と、それらがマッピングされる GraphQL 型を示します。
JSON/BSON 型 | GraphQL 型 |
---|---|
objectId | ObjectId |
int | Int |
long | Int |
double | Float |
decimal | Float |
date | DateTime |
timestamp | DateTime |
注意
JSON は、「値なし」を表す 2 つの型、 undefined
とnull
をサポートしています。GraphQL 仕様では null
がサポートされていますが、 undefined
はサポートされていませんので、アプリは次のように undefined
値を変換します。
ドキュメント フィールドが明示的に
undefined
に設定されている場合、対応する GraphQL 型は空のオブジェクト(つまり{}
)になります。ドキュメントに対してフィールド名がまったく定義されていない場合、または値が明示的に
null
に設定されている場合、対応する GraphQL 型はnull
になります。
入力型
GraphQLは入力型 を使用するクエリやミューテーションに渡すパラメータを表します。これは、すべての GraphQL API で使用される標準的なアプローチであり、明確で型安全なユーザー入力を定義します。
クエリ入力
QueryInput
オブジェクトは、クエリに含めるためにドキュメントが満たす必要がある 1 つ以上の条件のセットを定義します。オブジェクトには、ドキュメント型のフィールドだけでなく、App Services が各フィールドの型に基づいて自動的に生成する任意の演算子フィールドが含まれる場合があります。
ドキュメント フィールド:
QueryInput
フィールドの名前がドキュメント型のフィールドと同じである場合、入力フィールドに指定された値とドキュメント内のフィールドの値が同じであれば、App Services はドキュメントを一致させます。例
次のクエリには、2 つのフィールドを持つ
QueryInput
と、rated
とyear
が含まれています。これらのフィールド名は両方ともMovie
ドキュメント型で定義されているため、App Services は両方に対して等価一致を実行します。このクエリは、2000 年にリリースされ、R 指定されたすべての映画のタイトルを返します。
movies(query: { rated: "R", year: 2000 }) { title } 演算子フィールド:
QueryInput
フィールドがクエリ対象型の有効な演算子フィールドである場合、演算子がtrue
と評価すると、App Services はドキュメントを照合します。例
次のクエリには、2 つのフィールドを持つ
QueryInput
と、rated_in
とyear_gt
が含まれています。これらはどちらも演算子フィールドなので、App Services は各演算子を評価して文書が一致するかどうかを判断します。このクエリは、2000 年以降にリリースされ、G または PG-13 指定されたすべての映画のタイトルを返します。
movies(query: { rated_in: ["G", "PG-13"], year_gt: 2000 }) { title }
比較演算子フィールド
比較演算子フィールドを使用すると、範囲クエリなど、正確な等価性よりも複雑な条件を定義できます。App Services は、フィールド型に基づいて、ドキュメント型のすべてのフィールドに対して比較演算子フィールドのセットを生成します。通常、各比較演算子はすべてのフィールド型のサブセットにのみ適用されるため、App Services は有効な組み合わせの演算子フィールドのみを生成します。
ドキュメント内のフィールドの値が指定された値に対する演算子条件を満たす場合、比較演算子フィールドは特定のドキュメントに対してtrue
と評価します。
比較演算子のフィールドの形式は次のとおりです。
<Field Name>_<Operator>: <Operator Value>
演算子 | サポートされているフィールド型 | 演算子の値の型 | 説明 | ||||
---|---|---|---|---|---|---|---|
gt | Int Float String ObjectId DateTime | <Field Type> | フィールドは指定した値より大きいドキュメントを検索します。 例このクエリは、2000 年以降にリリースされたすべての映画を検索します。
| ||||
gte | Int Float String ObjectId DateTime | <Field Type> | フィールドは指定した値以上のドキュメントを検索します。 例このクエリは、2000 年以降にリリースされたすべての映画を検索します。
| ||||
lt | Int Float String ObjectId DateTime | <Field Type> | フィールドが指定した値より小さいドキュメントを検索します。 例このクエリは、2000 年以前に公開されたすべての映画を検索します。
| ||||
lte | Int Float String ObjectId DateTime | <Field Type> | フィールドが指定した値以下のドキュメントを検索します。 例このクエリは、2000 年以前に公開されたすべての映画を検索します。
| ||||
ne | Int Float String Boolean ObjectId DateTime | <Field Type> | フィールドが指定された値と等しくないドキュメントを検索します。 例このクエリは、2000 年以外の年に公開されたすべての映画を検索します。
| ||||
in | Int Float String Boolean ObjectId DateTime Array | [<Field Type>] | フィールドが、指定した配列のいずれかの値と等しいドキュメントを検索します。フィールドが 例このクエリは、エマ・ストーンとライアン・ゴズリングのどちらかまたは両方をフィーチャーしたすべての映画を検索します。
| ||||
nin | Int Float String Boolean ObjectId DateTime Array | [<Field Type>] | フィールドが、指定した配列のどの値とも等しくないドキュメントを検索します。フィールドが 例このクエリは、G または PG-13指定されていないすべての映画を検索します。
|
論理演算子フィールド
論理演算子フィールドを使用すると、独立したQueryInput
オブジェクトの論理的な組み合わせを定義できます。App Services は、すべてのQueryInput
型に対してルート レベルの論理演算子フィールドを生成します。
指定されたすべての QueryInput
オブジェクトの評価結果が演算子条件を満たす場合、そのドキュメントの論理演算子フィールドは true
と評価されます。
論理演算子フィールドの形式は次のとおりです。
<Operator>: [<QueryInput>, ...]
演算子 | 演算子の値の型 | 説明 | ||||||
---|---|---|---|---|---|---|---|---|
および | [QueryInput!] | 指定されたすべての 例このクエリは、PG-13 指定でさらに上映時間が 120 分未満のすべての映画を検索します。
| ||||||
または | [QueryInput!] | 指定された 例このクエリは、G または PG-13 指定のすべての映画を検索します。
|
要素演算子フィールド
要素演算子フィールドを使用すると、ドキュメント内のフィールドを記述するブール値条件を定義できます。App Servicesは、ドキュメント型のすべてのフィールドに対して一連の要素演算子フィールドを生成します。
文書内のフィールドの演算子条件を評価した結果が指定されたブール値と一致する場合、その文書の要素演算子フィールドは true
と評価されます。
要素演算子フィールドの形式は次のとおりです。
<Field Name>_<Operator>: <Operator Value>
演算子 | サポートされているタイプ | 演算子の値の型 | 説明 | ||||||
---|---|---|---|---|---|---|---|---|---|
exists | すべてのタイプで利用可能 | ブール値 | フィールドが 例このクエリは、
|
InsertInput
InsertInput
オブジェクトは、コレクションに挿入するドキュメントを定義します。ドキュメントは GraphQL ドキュメント型に準拠し、すべての必須フィールドを含める必要があります。
例
次のミューテーションには、InsertInput
が含まれています。フィールドは複数あり、これらはすべて Movie
ドキュメント型で定義されています。Movie
タイプでは、すべてのドキュメントに title
フィールドが必要です。そのため、InsertInput
にはフィールドを含める必要があります。
ミューテーションにより " My Fake Film " という名前の新しいムービーが挿入されます。
insertOneMovie(input: { title: "My Fake Film", rated: "UNRATED", year: 2020 }) { title }
UpdateInput
UpdateInput
オブジェクトは、ドキュメント内の 1 つ以上のフィールドに新しい値を定義します。更新されたドキュメントには新しいフィールド値が含まれます。指定しないフィールドは変更されません。更新された値は、GraphQL ドキュメント タイプに準拠している必要があります。
例
次のミューテーションには、 title
フィールドを "My Super Real Film" に設定するUpdateInput
が含まれています。
updateOneMovie( query: { title: "My Fake Film" } set: { title: "My Super Real Film" } ) { title }
関係入力
RelationInput
は、変更されたドキュメント内の関係フィールドに関連するドキュメントの新しいセットを定義します。link
フィールドを使用して関連コレクションに既に存在するドキュメントを参照したり、create
フィールドを使用して関連コレクションに新しいドキュメントを挿入したりできます。
link
とcreate
の両方を同時に使用することはできません。両方が指定されている場合は、 create
操作が優先され、 link
は無視されます。
type RelationInput { link: [ObjectId] create: [InsertInput] }
例
次のミューテーションには、 reviews
フィールドを変更するUpdateInput
が含まれています。フィールドには、別の reviews
コレクション内のドキュメントの _id
値の配列が含まれます。これは、フィールドとの関係が定義されているためです。
このミューテーションにより、新しく作成された 1 つのドキュメントと reviews
コレクション内の 2 つの既存のドキュメントを指すように関係が設定されます。
updateOneMovie( query: { title: "My Fake Film" } set: { reviews: { link: ["", ""] create: [] } } ) { title }
入力による並べ替え
SortByInput
列挙型は、クエリによって返されるドキュメントの並べ替え順序を定義します。object
または array
のタイプがないルートレベルのフィールドであれば、昇順または降順でソートできます。GraphQL API はネストされたソートをサポートしていません。
App Services は、フィールドごとに 2 つの並べ替え列挙値を生成します。各値は、フィールド名とソート方向(ASC
または DESC
)を組み合わせた完全大文字の識別子です。
例
次のクエリは、公開された年順に並べられた映画を返します。最新の映画が最初にリストされます。
movies(sortBy: YEAR_DESC) { title }
クエリリゾルバ
Atlas App Services は、次のようにコレクションごとに 2 つの GraphQL クエリを生成します。
コレクション内のドキュメントを検索する単数形クエリ。
コレクション内のすべての文書を検索する複数形クエリ。複数形のクエリをフィルタリングして、
QueryInput
と一致するコレクション内のドキュメントのサブセットのみを含めることができます。
単一ドキュメントの検索
単一ドキュメント クエリ フィールドでは、コレクションに含まれるデータ型と同じ名前が使用されます。クエリされたタイプの単一のドキュメントを返し、次のパラメータを受け入れます。
Parameter | タイプ | 説明 |
---|---|---|
query | 任意。コレクション内のドキュメントのフィルターを定義するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
|
query { movie(query: { title: "The Matrix" }) { title year runtime director } }
複数ドキュメントの検索
マルチ ドキュメント クエリ フィールドは、コレクションに含まれるデータ型と同じ名前を使用しますが、型名の後に "s"
が追加されます。クエリされた型のドキュメントの配列を返し、次のパラメータを受け入れます。
Parameter | GraphQL 型 | 説明 |
---|---|---|
query | 任意。コレクション内のドキュメントのフィルターを定義するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
| |
limit | Int | 任意。デフォルトは 100 。クエリ結果セットに含めるドキュメントの最大数。クエリが設定された制限値以上にマッチした場合は、マッチしたドキュメントのサブセットのみが返されます。 |
sortBy | 任意。クエリ結果セット内のドキュメントの並べ替え順序を定義する値。
|
query { movies( query: { year: 2000 } limit: 100 sortBy: TITLE_ASC ) { title year runtime director } }
ミューテーション リゾルバ
App Services は、各コレクション内のドキュメントに対して一連のミューテーションを生成します。これらを使用すると、1 つ以上のドキュメントを挿入、変更、および削除できます。
単一ドキュメントのインサート
単一ドキュメント挿入ミューテーション フィールドはinsertOne<Type>
という名前を使用し、 <Type>
はコレクションが含むデータ型の単数形の名前です。挿入されたドキュメントを返し、以下のパラメータを受け付けます。
Parameter | タイプ | 説明 |
---|---|---|
data | 必須。コレクションに挿入するドキュメント。コレクション スキーマでフィールドが必須とマークされている場合、このドキュメントにはそのフィールドの有効な値を含める必要があります。App Services は、 InsertInput オブジェクト内の GraphQL 型をそれぞれの BSON 型に自動的に変換します。 |
mutation { insertOneMovie(data: { title: "Little Women" director: "Greta Gerwig" year: 2019 runtime: 135 }) { _id title } }
複数のドキュメントの挿入
複数文書を挿入するミューテーション フィールドには insertMany<Type>s
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。挿入されたドキュメントを返し、以下のパラメータを受け付けます。
Parameter | タイプ | 説明 |
---|---|---|
data | [InsertInput!]! | 必須。コレクションに挿入するドキュメントの配列。配列には少なくとも 1 つのドキュメントが含まれている必要があります。コレクション スキーマでフィールドが必須とマークされている場合、各ドキュメントにはそのフィールドの有効な値を含める必要があります。App Services は、 InsertInput オブジェクト内の GraphQL 型を、コレクション スキーマで定義されているそれぞれの BSON 型に自動的に変換します。 |
mutation { insertManyMovies(data: [ { title: "Little Women" director: "Greta Gerwig" year: 2019 runtime: 135 }, { title: "1917" director: "Sam Mendes" year: 2019 runtime: 119 } ]) { _id title } }
単一ドキュメントの更新
単一ドキュメント更新ミューテーション フィールドには updateOne<Type>
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。更新されたドキュメントを返し、以下のパラメータを受け付けます。
Parameter | タイプ | 説明 |
---|---|---|
query | 任意。コレクション内のどのドキュメントを更新するかを構成するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
| |
set | UpdateInput! | 必須。ドキュメント内の 1 つ以上のフィールドに新しい値を定義するオブジェクト。更新されたドキュメントには新しいフィールド値が含まれます。指定しないフィールドは変更されません。App Services は、 UpdateInput オブジェクト内の GraphQL 型をそれぞれの BSON 型に自動的に変換します。 |
mutation { updateOneMovie( query: { title: "The Room" } set: { runtime: 99 } ) { _id title } }
複数のドキュメントの更新
複数ドキュメント更新ミューテーション フィールドでは updateMany<Type>s
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。照合および変更されたフィールドの数を示す UpdateManyPayload
ドキュメントが返され、次のパラメーターを受け入れます。
Parameter | タイプ | 説明 |
---|---|---|
query | 任意。コレクション内のどのドキュメントを更新するかを構成するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
| |
set | 必須。ドキュメント内の 1 つ以上のフィールドに新しい値を定義するオブジェクト。更新されたドキュメントには新しいフィールド値が含まれます。指定しないフィールドは変更されません。App Services は、 UpdateInput オブジェクト内の GraphQL 型をそれぞれの BSON 型に自動的に変換します。 |
mutation { updateManyMovies( query: { director: "Tommy Wiseau" } set: { director: "Tom Wiseau" } ) { matchedCount modifiedCount } }
単一ドキュメントのアップサート
単一文書のアップサートミューテーション フィールドには upsertOne<Type>
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。このリゾルバーは、クエリ パラメータに一致するドキュメントを更新し、クエリに一致するドキュメントがない場合は新しいドキュメントを挿入します。アップサートされたドキュメントを返し、次のパラメータを受け入れます。
Parameter | タイプ | 説明 |
---|---|---|
query | 任意。更新するドキュメントを構成するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
| |
data | 必須。 query 既存のドキュメントと一致しない場合に挿入するドキュメント。query が一致する場合、クエリされたドキュメントが任意のドキュメントに置き換えられます。コレクション スキーマでフィールドが必須とマークされている場合、このドキュメントにはそのフィールドの有効な値を含める必要があります。App Services は、 InsertInput オブジェクト内の GraphQL 型をそれぞれの BSON 型に自動的に変換します。 |
mutation { upsertOneMovie( query: { title: "Blacksmith Scene" } data: { title: "Sandcastles in the Sand", director: "Robin Scherbatsky" runtime: 90 year: 2002 } ) { _id title } }
単一ドキュメントの置換
単一ドキュメント置換ミューテーション フィールドは replaceOne<Type>
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。置換されたドキュメントを返し、以下のパラメータを受け付けます。
Parameter | タイプ | 説明 |
---|---|---|
query | 任意。コレクション内のどのドキュメントを置き換えるかを構成するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
| |
data | 必須。クエリされたドキュメントを置き換えるドキュメント。コレクション スキーマでフィールドが必須とマークされている場合、このドキュメントにはそのフィールドの有効な値を含める必要があります。App Services は、 InsertInput オブジェクト内の GraphQL 型をそれぞれの BSON 型に自動的に変換します。 |
mutation { replaceOneMovie( query: { title: "Blacksmith Scene" } data: { title: "Sandcastles in the Sand", director: "Robin Scherbatsky" runtime: 90 year: 2002 } ) { _id title } }
単一ドキュメントの削除
単一文書削除ミューテーション フィールドには deleteOne<Type>
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。削除されたドキュメントを返し、以下のパラメータを受け付けます。
Parameter | タイプ | 説明 |
---|---|---|
query | 必須。コレクション内のどのドキュメントを削除するかを構成するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
|
mutation { deleteOneMovie(query: { title: "The Room" }) { _id title year runtime director } }
複数のドキュメントの削除
複数文書削除ミューテーション フィールドには deleteMany<Type>s
という名前を使用します。<Type>
はコレクションに含まれるデータ型の単数形の名前です。この関数は、削除されたドキュメントの数を示す DeleteManyPayload
ドキュメントを返し、以下のパラメータを受け入れます。
Parameter | タイプ | 説明 |
---|---|---|
query | 任意。コレクション内のどのドキュメントを削除するかを構成するオブジェクト。オブジェクトはデータ型から 1 つ以上のフィールドを指定でき、各フィールドの値を含める必要があります。クエリは、指定されたフィールド値を含むすべてのドキュメントと一致します。
|
mutation { deleteManyMovies(query: { director: "Tommy Wiseau" }) { deletedCount } }
Paginate Data
GraphQL API で生成されたスキーマによって提供されるタイプを使用して、クエリのデータをページ分割できます。
Atlas GraphQL API には、 GraphQL offset
のドキュメントがページ分割を推奨して いるように、 演算子 はありません 。
代わりに、生成されたスキーマの複数ドキュメントの検索クエリ リゾルバを query
、limit
、および sortBy
演算子とともに使用して、データをページ分割できます。
データを昇順にページ付けする:
query PaginateAscending( # Do not include `previousTitle` for the first query # in a pagination sequence. $previousTitle: String, $limit: Int!, ) { movies( query: { title_gt: $previousTitle } limit: $limit sortBy: TITLE_ASC ) { title year runtime director } }
データを降順にページ付けする:
query PaginateAscending( # Do not include `nextTitle` for the first query # in a pagination sequence. $nextTitle: String, $limit: Int!, ) { movies( query: { title_lt: $nextTitle } limit: $limit sortBy: TITLE_DESC ) { title year runtime director } }
クライアント アプリケーションに実装されたこのページ分割のパターンの例については、Realm Web SDK ドキュメントの「データのページ分割」を参照してください。
注意
このページ区切りのアプローチは、 MongoDB Server のドキュメントで説明されているように、MongoDB ドライバーの範囲クエリに類似しています。