Overview
Atlas App Services genera automáticamente un esquema GraphQL para cualquier colección que tenga un esquema definido. Para cada colección, App Services genera lo siguiente:
A tipo de documento que representa un solo documento en la colección
Un conjunto de consultas y mutaciones que le permiten acceder y manipular documentos de la colección.
Un conjunto de tipos de entradas que permiten filtrar queries, modificar campos específicos y ordenar resultados.
Nota
Ejemplo de esquema de colección
Esta página incluye ejemplos que demuestran valores generados según el siguiente esquema para un movies recopilación:
{ "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 escalares
App Services admite todos los tipos escalares estándar de GraphQLy también genera el ObjectId escalar.
Se admiten los siguientes tipos escalares:
ObjectId: Un valor ObjectId serializado como un stringBoolean:trueofalseString: Una secuencia de caracteres UTF‐8Int: Un entero con signo de 32bitsLong: Un entero con signo de 64bitsFloat:Un valor de punto flotante de doble precisión con signoDateTime: Una fecha 3339 y hora UTC RFC (por ejemplo, "2020-09-01T::.15 3814918Z")
Tipos de documentos
App Services genera un único tipo GraphQL para los documentos de una colección, según el esquema de la misma. El tipo usa el nombre definido en el title campo del esquema o el nombre de la colección si no title se especifica.
type Movie { _id: ObjectId title: String! year: Int rated: String runtime: Int director: String cast: [String] }
Mapeo de campos
App Services intenta asignar los campos del esquema de tu colección directamente a los campos de tus tipos GraphQL. La definición de nombres válidos descrita en la especificación GraphQL no admite todos los nombres de campo de documento válidos posibles, por lo que App Services aplica las siguientes reglas de transformación para determinar los nombres de campo en los tipos GraphQL generados:
eliminar caracteres no admitidos
números iniciales de la tira
convertir a camel case
omitir los campos que comienzan con un guión bajo doble (por ejemplo,
__myField)
Mapeo de tipos BSON
El sistema de tipos GraphQL es similar, pero no idéntico, a los tipos BSON que se pueden usar en un esquema. App Services intenta automáticamente establecer una correspondencia entre los tipos BSON del esquema y los tipos GraphQL compatibles. Si un tipo de campo no tiene un equivalente GraphQL, App Services no lo incluye en el tipo de documento GraphQL generado.
La siguiente tabla enumera los tipos BSON que puede utilizar en un esquema y los tipos GraphQL a los que se asignan:
Tipo JSON/BSON | Tipo GraphQL |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nota
JSON admite dos tipos que representan "sin valor": undefined y null. La especificación GraphQL admite null, pero no undefined, por lo que su aplicación convierte los valores undefined de la siguiente manera:
Si un campo de documento se establece explícitamente en
undefined, entonces el tipo GraphQL correspondiente es un objeto vacío, es decir,{}.Si el nombre del campo no está definido para el documento, o si el valor se establece explícitamente en
null, entonces el tipo GraphQL correspondiente esnull.
Tipos de entrada
GraphQL utiliza tipos de entrada para representar los parámetros que pasas a las consultas y mutaciones. Este es el enfoque estándar utilizado por todas las APIs de GraphQL para definir entradas de usuario inequívocas y seguras en cuanto a tipo.
Entrada de consulta
Un QueryInput objeto define un conjunto de una o más condiciones que un documento debe cumplir para ser incluido en una consulta. El objeto puede incluir campos del tipo de documento, así como cualquiera de los campos de operador que App Services genera automáticamente según el tipo de campo.
Campos de documento: si un
QueryInputcampo tiene el mismo nombre que un campo en el tipo de documento, App Services coincide con un documento si el valor especificado en el campo de entrada y el valor del campo en el documento son los mismos.Ejemplo
La siguiente consulta incluye un
QueryInputcon dos campos,ratedyyear. Ambos nombres de campo están definidos en el tipo de documentoMovie, por lo que App Services realiza una coincidencia de igualdad para ambos.La consulta devuelve el título de todas las películas estrenadas en el año 2000 que están clasificadas R.
movies(query: { rated: "R", year: 2000 }) { title } Campos de operador: si un
QueryInputcampo es un campo de operador válido para el tipo consultado, App Services coincide con un documento si el operador se evalúatruecomo.Ejemplo
La siguiente consulta incluye un
QueryInputcon dos campos,rated_inyyear_gt. Ambos son campos de operador, por lo que App Services evalúa cada operador para determinar si un documento coincide.La consulta devuelve el título de todas las películas estrenadas después del año 2000 que estén clasificadas como G o PG-13.
movies(query: { rated_in: ["G", "PG-13"], year_gt: 2000 }) { title }
Campos del operador de comparación
Un campo de operador de comparación permite definir una condición más compleja que la igualdad exacta, como una consulta de rango. App Services genera un conjunto de campos de operador de comparación para cada campo del tipo de documento, según el tipo de campo. Cada operador de comparación suele aplicarse solo a un subconjunto de todos los tipos de campo, por lo que App Services solo genera campos de operador para combinaciones válidas.
Un campo de operador de comparación se evalúa como true para un documento determinado si el valor del campo en el documento satisface la condición del operador en relación con el valor especificado.
Los campos del operador de comparación tienen el siguiente formato:
<Field Name>_<Operator>: <Operator Value>
Operador | Tipos de campos admitidos | Tipo de valor del operador | Descripción | ||||
|---|---|---|---|---|---|---|---|
gt | IntFloatStringObjectIdDateTime |
| Encuentra documentos donde el campo es mayor que el valor especificado. EjemploEsta consulta encuentra todas las películas que se estrenaron después del año 2000: | ||||
gte | IntFloatStringObjectIdDateTime |
| Encuentra documentos donde el campo es mayor o igual al valor especificado. EjemploEsta consulta encuentra todas las películas que se estrenaron en o después del año 2000: | ||||
es | IntFloatStringObjectIdDateTime |
| Encuentra documentos donde el campo es menor que el valor especificado. EjemploEsta consulta encuentra todas las películas que se estrenaron antes del año 2000: | ||||
lte | IntFloatStringObjectIdDateTime |
| Encuentra documentos donde el campo es menor o igual al valor especificado. EjemploEsta consulta encuentra todas las películas que se estrenaron en o antes del año 2000: | ||||
ne | IntFloatStringBooleanObjectIdDateTime |
| Encuentra documentos donde el campo no es igual al valor especificado. EjemploEsta consulta encuentra todas las películas que se estrenaron en cualquier año excepto 2000: | ||||
in | IntFloatStringBooleanObjectIdDateTimeArray |
| Busca documentos donde el campo es igual a cualquier valor de la matriz especificada. Si el campo es EjemploEsta query encuentra todas las películas que presentan a Emma Stone y Ryan Gosling juntos o por separado: | ||||
nin | IntFloatStringBooleanObjectIdDateTimeArray |
| Busca documentos donde el campo no es igual a ningún valor de la matriz especificada. Si el campo es EjemploEsta consulta encuentra todas las películas que no están clasificadas como G o PG-13: |
Campos de operadores lógicos
Un campo de operador lógico permite definir combinaciones lógicas de objetos QueryInput independientes. App Services genera campos de operador lógico de nivel raíz para todos los tipos QueryInput.
Un campo de operador lógico se evalúa como true para un documento determinado si el resultado evaluado de todos los objetos QueryInput especificados satisfacen la condición del operador.
Los campos de operador lógico tienen la siguiente forma:
<Operator>: [<QueryInput>, ...]
Operador | Tipo de valor del operador | Descripción | ||||||
|---|---|---|---|---|---|---|---|---|
Y |
| Encuentra documentos que coinciden con todos los EjemploEsta consulta encuentra todas las películas con clasificación PG-13 y una 120 duración de menos de minutos: | ||||||
o |
| Busca documentos que coincidan con cualquiera de los EjemploEsta consulta encuentra todas las películas clasificadas G o PG-13: |
Campos de operadores de elementos
Un campo de operador de elemento permite definir una condición booleana que describe un campo del documento. App Services genera un conjunto de campos de operador de elemento para cada campo del tipo de documento.
Un campo de operador de elemento se evalúa como true para un documento determinado si el resultado de evaluar la condición del operador en el campo del documento coincide con el valor booleano especificado.
Los campos de operador de elemento tienen el siguiente formato:
<Field Name>_<Operator>: <Operator Value>
Operador | Tipos admitidos | Tipo de valor del operador | Descripción | ||||||
|---|---|---|---|---|---|---|---|---|---|
exists | Disponible para todo tipo | Booleano | Encuentra documentos donde el campo no es EjemploEsta consulta encuentra todas las películas que no tienen un valor definido para el campo |
Insertar entrada
Un objeto InsertInput define un documento que se insertará en una colección. El documento debe ser compatible con el tipo de documento GraphQL e incluir todos los campos obligatorios.
Ejemplo
La siguiente mutación incluye un InsertInput con varios campos definidos en el tipo de documento Movie. El tipo Movie requiere que todos los documentos tengan un campo title, por lo que el InsertInput debe incluir uno.
La mutación inserta una nueva película llamada "Mi película falsa".
insertOneMovie(input: { title: "My Fake Film", rated: "UNRATED", year: 2020 }) { title }
Actualizar entrada
Un objeto UpdateInput define un nuevo valor para uno o más campos de un documento. El documento actualizado incluye los nuevos valores de campo. Los campos que no especifique permanecerán sin cambios. Los valores actualizados deben ajustarse al tipo de documento GraphQL.
Ejemplo
La siguiente mutación incluye un UpdateInput que establece el campo title en "Mi película súper real".
updateOneMovie( query: { title: "My Fake Film" } set: { title: "My Super Real Film" } ) { title }
Relación de entrada
Un RelationInput define un nuevo conjunto de documentos relacionados para un campo de relación en el documento modificado. Puede referenciar documentos ya existentes en la colección relacionada con el campo link o insertar nuevos documentos en la colección relacionada con el campo create.
No se pueden usar link y create simultáneamente. Si se especifican ambos, la operación create tiene prioridad y la link se ignora.
type RelationInput { link: [ObjectId] create: [InsertInput] }
Ejemplo
La siguiente mutación incluye un UpdateInput que modifica el campo reviews. El campo contiene una matriz de _id valores para documentos de una colección reviews independiente para los que el campo tiene una relación definida.
La mutación establece la relación para apuntar a un documento recién creado y dos documentos existentes en la colección reviews.
updateOneMovie( query: { title: "My Fake Film" } set: { reviews: { link: ["", ""] create: [] } } ) { title }
Ordenar por entrada
Una enumeración SortByInput define un orden de clasificación para los documentos devueltos por una consulta. Puede ordenar en orden ascendente y descendente cualquier campo de nivel raíz que no tenga un tipo object o array. La API de GraphQL no admite ordenaciones anidadas.
App Services genera dos valores de enumeración de ordenación para cada campo. Cada valor es un identificador en mayúsculas que combina el nombre del campo y la dirección de ordenación, ya sea ASC o DESC.
Ejemplo
La siguiente query devuelve películas ordenadas por el año en que se estrenaron, con las más recientes al principio.
movies(sortBy: YEAR_DESC) { title }
Resolutores de query
App Services genera dos consultas GraphQL para cada colección:
Una query singular que encuentra un documento específico en la colección.
Una consulta plural que busca todos los documentos de la colección. Puede filtrar una consulta plural para incluir solo el subconjunto de documentos de una colección que coincidan
QueryInputcon.
Buscar un solo documento
El campo de consulta de documento único usa el mismo nombre que el tipo de datos que contiene la colección. Devuelve un documento único del tipo consultado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Opcional. Un objeto que define un filtro para los documentos de la colección. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no especifica un parámetro |
query { movie(query: { title: "The Matrix" }) { title year runtime director } }
Encuentra varios documentos
El campo de consulta de varios documentos usa el mismo nombre que el tipo de datos que contiene la colección, pero añade un "s" adicional al nombre del tipo. Devuelve una matriz de documentos del tipo consultado y acepta los siguientes parámetros:
Parameter | Tipo GraphQL | Descripción |
|---|---|---|
| Opcional. Un objeto que define un filtro para los documentos de la colección. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no especifica un argumento | |
| Int | Opcional. Por defecto |
| Opcional. Un valor que define el orden de clasificación de los documentos en el conjunto de resultados de la consulta. Puede ordenarlos en orden ascendente y descendente por cualquier campo de nivel raíz que no tenga el tipo El valor
Si no se especifica un argumento |
query { movies( query: { year: 2000 } limit: 100 sortBy: TITLE_ASC ) { title year runtime director } }
Resolucionadores de mutaciones
App Services genera un conjunto de mutaciones para los documentos de cada colección. Estas permiten insertar, modificar y eliminar uno o más documentos.
Inserta un solo documento
El campo de mutación de inserción de documento único usa el nombre insertOne<Type>, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Devuelve el documento insertado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Obligatorio. Un documento para insertar en la colección. Si el esquema de la colección marca un campo como obligatorio, este documento debe incluir un valor válido para dicho campo. App Services convierte automáticamente los tipos GraphQL del objeto |
mutation { insertOneMovie(data: { title: "Little Women" director: "Greta Gerwig" year: 2019 runtime: 135 }) { _id title } }
Inserta varios documentos
El campo de mutación de inserción de múltiples documentos usa el nombre insertMany<Type>s, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Devuelve el documento insertado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Obligatorio. Una matriz de documentos para insertar en la colección. La matriz debe contener al menos un documento. Si el esquema de la colección marca un campo como obligatorio, cada documento debe incluir un valor válido para dicho campo. App Services convierte automáticamente los tipos GraphQL del objeto |
mutation { insertManyMovies(data: [ { title: "Little Women" director: "Greta Gerwig" year: 2019 runtime: 135 }, { title: "1917" director: "Sam Mendes" year: 2019 runtime: 119 } ]) { _id title } }
Actualiza un solo documento
El campo de mutación de actualización de documento único usa el nombre updateOne<Type>, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Devuelve el documento actualizado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Opcional. Un objeto que configura los documentos de la colección que se actualizarán. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no se especifica un argumento | |
| ¡Actualizar entrada! | Obligatorio. Un objeto que define un nuevo valor para uno o más campos del documento. El documento actualizado incluirá los nuevos valores de campo. Cualquier campo que no especifique permanece sin cambios. Aplicación Services convierte automáticamente los tipos GraphQL en el objeto |
mutation { updateOneMovie( query: { title: "The Room" } set: { runtime: 99 } ) { _id title } }
Actualiza varios documentos
El campo de mutación de actualización de múltiples documentos usa el nombre updateMany<Type>s, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Devuelve un documento UpdateManyPayload que describe el número de campos que se compararon y modificaron, y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Opcional. Un objeto que configura los documentos de la colección que se actualizarán. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no se especifica un argumento | |
| Obligatorio. Un objeto que define un nuevo valor para uno o más campos del documento. El documento actualizado incluirá los nuevos valores de campo. Cualquier campo que no especifique permanece sin cambios. Aplicación Services convierte automáticamente los tipos GraphQL en el objeto |
mutation { updateManyMovies( query: { director: "Tommy Wiseau" } set: { director: "Tom Wiseau" } ) { matchedCount modifiedCount } }
Insertar un solo documento
El campo de mutación de inserción y actualización de un solo documento usa el nombre upsertOne<Type>, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Este solucionador actualiza un documento que coincide con el parámetro de consulta e inserta un nuevo documento si ninguno coincide con la consulta. Devuelve el documento insertado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Opcional. Un objeto que configura el documento que se actualizará. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no especifica un argumento | |
| Obligatorio. El documento que se insertará si el |
mutation { upsertOneMovie( query: { title: "Blacksmith Scene" } data: { title: "Sandcastles in the Sand", director: "Robin Scherbatsky" runtime: 90 year: 2002 } ) { _id title } }
Reemplazar un solo documento
El campo de mutación de reemplazo de documento único utiliza el nombre replaceOne<Type> donde <Type> es el nombre singular del tipo de dato que contiene la colección. Devuelve el documento reemplazado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Opcional. Un objeto que configura los documentos de la colección que se reemplazarán. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no especifica un argumento | |
| Obligatorio. El documento que reemplaza al documento consultado. Si el esquema de colección marca un campo como obligatorio, este documento debe incluir un valor válido para dicho campo. App Services convierte automáticamente los tipos GraphQL del objeto |
mutation { replaceOneMovie( query: { title: "Blacksmith Scene" } data: { title: "Sandcastles in the Sand", director: "Robin Scherbatsky" runtime: 90 year: 2002 } ) { _id title } }
Borrar un único documento
El campo de mutación de eliminación de un solo documento usa el nombre deleteOne<Type>, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Devuelve el documento eliminado y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Obligatorio. Un objeto que configura qué documento de la colección se eliminará. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si |
mutation { deleteOneMovie(query: { title: "The Room" }) { _id title year runtime director } }
Borra varios documentos
El campo de mutación de eliminación de varios documentos usa el nombre deleteMany<Type>s, donde <Type> es el nombre singular del tipo de datos que contiene la colección. Devuelve un documento DeleteManyPayload que describe el número de documentos eliminados y acepta los siguientes parámetros:
Parameter | Tipo | Descripción |
|---|---|---|
| Opcional. Un objeto que configura los documentos de la colección que se eliminarán. El objeto puede especificar uno o más campos del tipo de datos y debe incluir un valor para cada campo. La consulta busca todos los documentos que incluyan los valores de campo especificados. Si no especifica un argumento |
mutation { deleteManyMovies(query: { director: "Tommy Wiseau" }) { deletedCount } }
Paginar datos
Puede paginar datos en sus consultas con los tipos proporcionados por el esquema generado por la API GraphQL.
La API Atlas GraphQL no tiene un offset operador, como recomienda la documentación de GraphQL para la paginación.
En su lugar, puede utilizar los solucionadores de consultas de búsqueda de múltiples documentos del esquema generado con query loslimit operadores, y sortBy para paginar datos.
Para paginar datos en orden 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 datos en orden descendente:
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 ver un ejemplo de este patrón de paginación implementado en una aplicación cliente, consulte Paginar datos en la documentación del SDK web de Realm.
Nota
Este enfoque de paginación es similar a las consultas de rango para los controladores MongoDB, como se describe en la documentación del servidor MongoDB.