Tipos, Resolvedores e Operadores do GraphQL
Nesta página
- Visão geral
- Tipos de Escalar
- Tipos de documento
- Mapeamento de campo
- Mapeamento de Tipo BSON
- Tipos de Entrada
- Entrada de query
- InsertInput
- UpdateInput
- RelationInput
- Ordenar por Entrada
- Resolvedores de Query
- Encontrar um único documento
- Localizar vários documentos
- Resolvedores de mutação
- Inserir um único documento
- Insira vários documentos
- Atualizar um único documento
- Atualizar vários documentos
- Upsert um Único Documento
- Substituir um único documento
- Excluir um único documento
- Excluir vários documentos
- Paginate Data
Visão geral
O Atlas App Services gera automaticamente um esquema GraphQL para qualquer coleção que tenha um esquema definido. Para cada coleção, os Serviços de Aplicativo geram o seguinte:
Umtipo de documento que representa um único documento na coleção
Um conjunto de consultas e mutações que lhe permite acessar e manipular documentos na coleção.
Um conjunto de tipos de entrada que permite filtrar consultas, modificar campos específicos e classificar resultados.
Observação
Exemplo de Esquema de Coleção
Esta página inclui exemplos que demonstram valores gerados com base no seguinte esquema para uma coleção do 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" } } } }
Tipos de Escalar
O App Services é compatível com todos os tipos escalares padrão do GraphQL e também gera o escalar do ObjectId
.
Os seguintes tipos escalares são compatíveis:
ObjectId
: Um valor ObjectId serializado como uma stringBoolean
:true
oufalse
String
: Uma sequência de caracteres UTF-8Int
: Um número inteiro de 32 bits assinadoLong
: Um número inteiro de 64 bits assinadoFloat
: Um double-precision floating-point value assinadoDateTime
: Um RFC 3339 UTC DateTime (por exemplo, "2020-09-01T15:38:14.918Z")
Tipos de documento
O App Services gera um único tipo de GraphQL para os documentos em uma coleção com base no esquema da coleção. O tipo usa o nome definido no campo title
do esquema ou o nome da coleção se nenhum title
for especificado.
type Movie { _id: ObjectId title: String! year: Int rated: String runtime: Int director: String cast: [String] }
Mapeamento de campo
Os Serviços de Aplicativo tentam mapear campos em seu esquema de coleção diretamente para campos em seus tipos GraphQL. A definição de nomes válidos descrita na especificação GraphQL não oferece suporte a todos os possíveis nomes de campos de documento válidos, portanto, os Serviços de Aplicativo aplicam as seguintes regras de transformação para determinar nomes de campo em tipos de GraphQL gerados:
remover caracteres inválidos
remover números principais
converter para camel case
omite campos que comecem com um sublinhado duplo (por exemplo,
__myField
)
Mapeamento de Tipo BSON
O sistema de tipos do GraphQL é semelhante, mas não idêntico, aos tipos BSON que você pode usar em um esquema. O App Services tenta mapear automaticamente entre os tipos de BSON em seu esquema e os tipos compatíveis do GraphQL. Se um tipo de campo não tiver um equivalente do GraphQL, o App Services não incluirá o campo no tipo de documento GraphQL gerado.
A tabela a seguir lista os tipos de BSON que você pode usar em um esquema e os tipos do GraphQL para os quais eles mapeiam:
Tipo de JSON/BSON | Tipo do GraphQL |
---|---|
objectId | ObjectId |
int | Int |
long | Int |
double | Float |
decimal | Float |
date | DateTime |
timestamp | DateTime |
Observação
JSON oferece suporte a dois tipos que representam "sem valor": undefined
e null
. A especificação do GraphQL suporta null
, mas não undefined
, então seu aplicativo converte valores undefined
da seguinte maneira:
Se um campo de documento estiver explicitamente definido como
undefined
, o tipo do GraphQL correspondente será um objeto vazio, ou seja,{}
.Se o nome do campo não estiver definido para o documento, ou se o valor estiver explicitamente definido como
null
, o tipo GraphQL correspondente seránull
.
Tipos de Entrada
O GraphQL usa tipos de entrada para representar parâmetros que você passa para queries e mutações. Esta é uma abordagem padrão usada por todas as APIs GraphQL para definir entradas de usuário inequívocas e com segurança de tipo.
Entrada de query
Um objeto QueryInput
define um conjunto de uma ou mais condições que um documento deve atender para ser incluído em uma consulta. O objeto pode incluir campos do tipo de documento, bem como qualquer um dos campos de operador que os Serviços de Aplicativo geram automaticamente com base no tipo de cada campo.
Campos do Documento: se um campo
QueryInput
tiver o mesmo nome de um campo no tipo de documento, o App Services corresponderá a um documento se o valor especificado no campo de entrada e o valor do campo no documento forem iguais.Exemplo
A seguinte consulta inclui uma
QueryInput
com dois campos,rated
eyear
. Ambos os nomes de campo são definidos no tipo de documentoMovie
, portanto, o App Services executa uma correspondência de igualdade para ambos.A consulta retorna o título de todos os filmes lançados no ano 2000 com classificação R.
movies(query: { rated: "R", year: 2000 }) { title } Campos do operador: se um campo
QueryInput
for um campo de operador válido para o tipo de query, o App Services corresponderá a um documento se o operador avaliartrue
.Exemplo
A seguinte consulta inclui uma
QueryInput
com dois campos,rated_in
eyear_gt
. Ambos são campos de operador, portanto, os Serviços de Aplicativo avaliam cada operador para determinar se um documento corresponde.A consulta retorna o título de todos os filmes lançados após o ano de 2000 com classificação G ou PG-13.
movies(query: { rated_in: ["G", "PG-13"], year_gt: 2000 }) { title }
Campos do operador de comparação
Um campo de operador de comparação permite que você defina uma condição mais complexa do que a igualdade exata, como uma consulta de intervalo. O App Services gera um conjunto de campos de operadores de comparação para cada campo no tipo de documento com base no tipo de campo. Cada operador de comparação normalmente se aplica a apenas um subconjunto de todos os tipos de campo, portanto, o App Services gera campos de operador apenas para combinações válidas.
Um campo de operador de comparação é avaliado como true
para um determinado documento se o valor do campo no documento satisfizer a condição do operador em relação ao valor especificado.
Os campos do operador de comparação têm o seguinte formato:
<Field Name>_<Operator>: <Operator Value>
Operador | Tipos de Campo Compatíveis | Tipo de valor do operador | Descrição | ||||
---|---|---|---|---|---|---|---|
gt | Int Float String ObjectId DateTime | <Field Type> | Localiza documentos onde o campo é maior que o valor especificado. ExemploEsta consulta encontra todos os filmes lançados após o ano de 2000:
| ||||
gte | Int Float String ObjectId DateTime | <Field Type> | Encontra documentos onde o campo é maior ou igual ao valor especificado. ExemploEsta consulta encontra todos os filmes lançados no ano 2000 ou posteriormente:
| ||||
lt | Int Float String ObjectId DateTime | <Field Type> | Encontra documentos em que o campo é menor que o valor especificado. ExemploEsta consulta encontra todos os filmes lançados antes do ano de 2000:
| ||||
lte | Int Float String ObjectId DateTime | <Field Type> | Localiza documentos onde o campo é menor ou igual ao valor especificado. ExemploEsta consulta encontra todos os filmes lançados em ou antes do ano de 2000:
| ||||
ne | Int Float String Boolean ObjectId DateTime | <Field Type> | Localiza documentos onde o campo não é igual ao valor especificado. ExemploEsta consulta encontra todos os filmes lançados em qualquer ano além de 2000:
| ||||
Em | Int Float String Boolean ObjectId DateTime Array | [<Field Type>] | Localiza documentos onde o campo é igual a qualquer valor na matriz especificada. Se o campo for ExemploEsta consulta encontra todos os filmes que apresentam Emma Stone e Ryan Gosling, ou ambos:
| ||||
nin | Int Float String Boolean ObjectId DateTime Array | [<Field Type>] | Localiza documentos onde o campo não é igual a qualquer valor na matriz especificada. Se o campo for uma ExemploEsta consulta encontra todos os filmes que não estão classificados como G ou PG-13:
|
Campos de Operador Lógico
Um campo de operador lógico permite definir combinações lógicas de objetos QueryInput
independentes. o App Services gera campos de operador lógico no nível raiz para todos os tipos QueryInput
.
Um campo de operador lógico é avaliado como true
para um determinado documento se o resultado avaliado de todos os objetos QueryInput
especificados satisfizer a condição do operador.
Os campos do operador lógico têm o seguinte formulário:
<Operator>: [<QueryInput>, ...]
Operador | Tipo de valor do operador | Descrição | ||||||
---|---|---|---|---|---|---|---|---|
e a | [QueryInput!] | Encontra documentos que correspondem a todos os objetos ExemploEsta consulta encontra todos os filmes com classificação PG-13 e têm um tempo de execução inferior a 120 minutos:
| ||||||
ou | [QueryInput!] | Localiza documentos que correspondem a qualquer dos ExemploEsta consulta encontra todos os filmes com classificação G ou PG-13:
|
Campos do Operador de Elementos
Um campo de operador de elemento permite definir uma condição booleana que descreve um campo no documento. O App Services gera um conjunto de campos de operador de elementos para cada campo no tipo de documento.
Um campo de operador de elementos é avaliado como true
em determinado documento se o resultado da avaliação da condição de operador no campo do documento corresponder ao valor booleano especificado.
Os campos do operador de elementos têm o seguinte formato:
<Field Name>_<Operator>: <Operator Value>
Operador | Tipos suportados | Tipo de valor do operador | Descrição | ||||||
---|---|---|---|---|---|---|---|---|---|
existe | Disponível para todos os tipos | Boolean | Encontra documentos onde o campo não é ExemploEsta consulta encontra todos os filmes que não têm um valor definido para o campo
|
InsertInput
Um objeto InsertInput
define um documento para inserir em uma coleção. O documento deve estar em conformidade com o tipo de documento GraphQL e incluir todos os campos obrigatórios.
Exemplo
A mutação a seguir inclui um InsertInput
com vários campos definidos no tipo de documento Movie
. O tipo Movie
exige que todos os documentos tenham um campo title
, portanto o InsertInput
deve incluir um.
A mutação insere um novo filme chamado “Meu Filme Falso”.
insertOneMovie(input: { title: "My Fake Film", rated: "UNRATED", year: 2020 }) { title }
UpdateInput
Um objeto UpdateInput
define um novo valor para um ou mais campos em um documento. O documento atualizado inclui os novos valores de campo. Quaisquer campos que você não especificar permanecerão inalterados. Os valores atualizados devem estar em conformidade com o tipo de documento GraphQL.
Exemplo
A seguinte mutação inclui uma UpdateInput
que define o campo de title
como "Meu Super Filme Real".
updateOneMovie( query: { title: "My Fake Film" } set: { title: "My Super Real Film" } ) { title }
RelationInput
Um RelationInput
define um novo conjunto de documentos relacionados para um campo de relacionamento no documento mutado. Você pode referenciar documentos que já existem na coleção relacionada com o campo link
ou inserir novos documentos na coleção relacionada com o campo create
.
Você não pode usar link
e create
ao mesmo tempo. Se ambos forem especificados, a operação create
terá precedência e o link
será ignorado.
type RelationInput { link: [ObjectId] create: [InsertInput] }
Exemplo
A mutação a seguir inclui um UpdateInput
que modifica o campo reviews
. O campo contém uma matriz de _id
valores para documentos em uma coleção reviews
separada para a qual o campo tem uma relação definida.
A mutação define o relacionamento para apontar para um documento recém-criado e dois documentos existentes na coleção reviews
.
updateOneMovie( query: { title: "My Fake Film" } set: { reviews: { link: ["", ""] create: [] } } ) { title }
Ordenar por Entrada
Uma enumeração SortByInput
define uma ordem de classificação para documentos retornados por uma consulta. Você pode classificar em ordem crescente e decrescente por qualquer campo de nível raiz que não tenha um tipo de object
ou array
. A API GraphQL não oferece suporte a classificações aninhadas.
App Services geram dois valores de enumeração de classificação para cada campo. Cada valor é um identificador totalmente capitalizado que combina o nome do campo e a direção de classificação, ASC
ou DESC
.
Exemplo
A consulta a seguir retorna filmes ordenados pelo ano em que foram lançados, com os filmes mais recentes listados primeiro.
movies(sortBy: YEAR_DESC) { title }
Resolvedores de Query
O App Services gera duas consultas do GraphQL para cada coleção:
Uma consulta singular que encontra um documento específico na coleção.
Uma consulta plural que encontra todos os documentos da coleção. Você pode filtrar uma consulta plural para incluir somente o subconjunto de documentos em uma coleção que corresponda a
QueryInput
.
Encontrar um único documento
O campo de consulta de documento único utiliza o mesmo nome que o tipo de dados que a coleção contém. Ele retorna um único documento do tipo consultado e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Opcional. Um objeto que define um filtro para documentos na coleção. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um parâmetro de |
query { movie(query: { title: "The Matrix" }) { title year runtime director } }
Localizar vários documentos
O campo de consulta de vários documentos usa o mesmo nome que o tipo de dados que a coleção contém, mas tem um "s"
adicional anexado ao nome do tipo. Ele retorna uma matriz de documentos do tipo consultado e aceita os seguintes parâmetros:
Parâmetro | Tipo do GraphQL | Descrição |
---|---|---|
query | Opcional. Um objeto que define um filtro para documentos na coleção. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um argumento | |
limit | Int | Opcional. Padrão 100 . O número máximo de documentos a incluir no conjunto de resultados da consulta. Se a consulta corresponder a mais do que o limite definido, ela retornará apenas um subconjunto de documentos correspondentes. |
sortBy | Opcional. Um valor que define uma ordem de classificação para documentos no conjunto de resultados da consulta. Você pode classificar em ordem crescente e decrescente por qualquer campo de nível raiz que não tenha um tipo de O valor
Se você não especificar um argumento |
query { movies( query: { year: 2000 } limit: 100 sortBy: TITLE_ASC ) { title year runtime director } }
Resolvedores de mutação
O App Services gera um conjunto de mutações para os documentos em cada coleção. Isso permite inserir, modificar e excluir um ou mais documentos.
Inserir um único documento
O campo de mutação de inserção de documento único utiliza o nome insertOne<Type>
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Ele retorna o documento inserido e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
data | Obrigatório. Um documento para inserir na coleção. Se o esquema de coleção marcar um campo como obrigatório, esse documento deverá incluir um valor válido para esse campo. O App Services converte automaticamente os tipos do GraphQL no objeto InsertInput em seu respectivo tipo de BSON. |
mutation { insertOneMovie(data: { title: "Little Women" director: "Greta Gerwig" year: 2019 runtime: 135 }) { _id title } }
Insira vários documentos
O campo de mutação de inserção de documento múltiplo usa o nome insertMany<Type>s
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Ele retorna o documento inserido e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
data | [InsertInput!]! | Obrigatório. Um matriz de documentos para inserir na coleção. A matriz deve conter pelo menos um documento. Se o esquema de coleção marcar um campo como obrigatório, cada documento deverá incluir um valor válido para esse campo. O App Services converte automaticamente os tipos GraphQL no objeto InsertInput em seu respectivo tipo BSON, conforme definido no esquema da coleção. |
mutation { insertManyMovies(data: [ { title: "Little Women" director: "Greta Gerwig" year: 2019 runtime: 135 }, { title: "1917" director: "Sam Mendes" year: 2019 runtime: 119 } ]) { _id title } }
Atualizar um único documento
O campo de mutação de atualização de documento único utiliza o nome updateOne<Type>
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Ele retorna o documento atualizado e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Opcional. Um objeto que configura quais documentos da coleção atualizar. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um argumento | |
set | UpdateInput! | Obrigatório. Um objeto que define um novo valor para um ou mais campos no documento. O documento atualizado incluirá os novos valores de campo. Quaisquer campos que você não especificar permanecerão inalterados. O App Services converte automaticamente os tipos do GraphQL no objeto UpdateInput em seu respectivo tipo de BSON. |
mutation { updateOneMovie( query: { title: "The Room" } set: { runtime: 99 } ) { _id title } }
Atualizar vários documentos
O campo de mutação de atualização de vários documentos usa o nome updateMany<Type>s
, em que <Type>
é o nome singular do tipo de dados que a coleta contém. Retorna um documento UpdateManyPayload
que descreve o número de campos que foram correspondidos e modificados e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Opcional. Um objeto que configura quais documentos da coleção atualizar. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um argumento | |
set | Obrigatório. Um objeto que define um novo valor para um ou mais campos no documento. O documento atualizado incluirá os novos valores de campo. Quaisquer campos que você não especificar permanecerão inalterados. O App Services converte automaticamente os tipos do GraphQL no objeto UpdateInput em seu respectivo tipo de BSON. |
mutation { updateManyMovies( query: { director: "Tommy Wiseau" } set: { director: "Tom Wiseau" } ) { matchedCount modifiedCount } }
Upsert um Único Documento
O campo de mutação de inserir de documento único usa o nome upsertOne<Type>
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Esse resolvedor atualiza um documento que corresponde ao parâmetro de consulta e insere um novo documento se nenhum corresponder à consulta. Ele retorna o documento inserido e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Opcional. Um objeto que configura qual documento atualizar. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um argumento | |
data | Obrigatório. O documento a inserir se o query não corresponder a nenhum documento existente. Se o query corresponder a um documento, ele substituirá o documento que passou pela query. Se o esquema de collection marcar um campo como obrigatório, esse documento deverá incluir um valor válido para esse campo. O App Services converte automaticamente os tipos do GraphQL no objeto de InsertInput em seu respectivo tipo de BSON. |
mutation { upsertOneMovie( query: { title: "Blacksmith Scene" } data: { title: "Sandcastles in the Sand", director: "Robin Scherbatsky" runtime: 90 year: 2002 } ) { _id title } }
Substituir um único documento
O campo de mutação de substituição de documento único usa o nome replaceOne<Type>
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Ele retorna o documento substituído e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Opcional. Um objeto que configura quais documentos na coleção substituir. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um argumento | |
data | Obrigatório. O documento que substitui o documento consultado. Se o esquema de coleção marcar um campo como obrigatório, esse documento deverá incluir um valor válido para esse campo. O App Services converte automaticamente os tipos do GraphQL no objeto InsertInput em seu respectivo tipo de BSON. |
mutation { replaceOneMovie( query: { title: "Blacksmith Scene" } data: { title: "Sandcastles in the Sand", director: "Robin Scherbatsky" runtime: 90 year: 2002 } ) { _id title } }
Excluir um único documento
O campo de mutação de exclusão de documento único usa o nome deleteOne<Type>
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Ele retorna o documento excluído e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Obrigatório. Um objeto que configura qual documento na coleção excluir. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se a |
mutation { deleteOneMovie(query: { title: "The Room" }) { _id title year runtime director } }
Excluir vários documentos
O campo de mutação de exclusão de múltiplos documentos usa o nome deleteMany<Type>s
, em que <Type>
é o nome singular do tipo de dados que a coleção contém. Retorna um documento DeleteManyPayload
que descreve o número de documentos que foram excluídos e aceita os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
query | Opcional. Um objeto que configura quais documentos da coleção excluir. O objeto pode especificar um ou mais campos do tipo de dados e deve incluir um valor para cada campo. A consulta corresponde a todos os documentos que incluem os valores de campo especificados. Se você não especificar um argumento da |
mutation { deleteManyMovies(query: { director: "Tommy Wiseau" }) { deletedCount } }
Paginate Data
Você pode paginar dados em suas consultas com os tipos fornecidos pelo esquema gerado pela GraphQL API.
A API Atlas GraphQL não tem um operador offset
, como a documentação GraphQL recomenda para paginação.
Em vez disso, você pode usar os resolvedores de query de localização de vários documentos do esquema gerado com os operadores query
, limit
e sortBy
para paginar os dados.
Para paginar dados em ordem ascendente:
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 } }
Para paginar dados em ordem decrescente :
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 } }
Para obter um exemplo deste padrão de paginação implementado em um aplicativo cliente, consulte Paginar Dados na documentação do Realm Web SDK.
Observação
Essa abordagem à paginação é semelhante às query de intervalo para drivers do MongoDB Server, conforme descrito na documentação do MongoDB Server.