¿Por qué mis consultas de listas devuelven un número incorrecto de elementos cuando uso DynamoDB con AWS AppSync?

Última actualización: 22-06-2022

Mis consultas de listas devuelven un número incorrecto de elementos cuando utilizo Amazon DynamoDB con AWS AppSync. ¿Cómo se soluciona esto?

Descripción corta

Cuando utiliza una consulta de lista con AWS AppSync y Amazon DynamoDB, DynamoDB realiza una operación de análisis en la tabla y devuelve un número determinado de elementos evaluados. Si proporciona una operación FilterExpression en la solicitud, DynamoDB aplica FilterExpression solo a estos elementos evaluados.

El número de elementos que el análisis evalúa depende de la variable de límite que haya aplicado a la consulta. Si no se aplica ningún límite, DynamoDB utiliza el límite predeterminado que está configurado en la plantilla de asignación de solicitudes. El análisis devuelve solo los elementos que se evalúan y coinciden con la expresión de filtro. Para devolver el número esperado de elementos, debe ajustar la variable de límite.

Puede aumentar el límite predeterminado de su plantilla de asignación o agregar una variable de límite a la consulta GraphQL de la lista. Sin embargo, el número máximo de elementos que puede evaluar es de 1 MB. Si la operación de análisis supera 1 MB de datos, puede utilizar lapaginación para obtener el resto de los datos. Para ayudarlo a consultar una base de datos que tiene miles de elementos, puede indexar los datos para filtrar resultados por un campo común.

Resolución

Aumentar el límite predeterminado

En la siguiente plantilla de asignación de ejemplo para una API generada por AWS Amplify, el límite predeterminado es 100:

#set( $limit = $util.defaultIfNull($context.args.limit, 100) )
#set( $ListRequest = {
  "version": "2018-05-29",
  "limit": $limit
} )

Para evaluar más elementos, cambie el límite predeterminado en la plantilla de asignación. O bien, agregue una variable de límite a la consulta de lista. Por ejemplo, en la siguiente consulta de lista, el límite se establece en 1000:

query MyQuery {
  listEmployees(limit: 1000) {
    items {
      id
      name
      company
    }
  }
}

Paginar con AWS AppSync

Para paginar con AWS AppSync, agregue un argumentonextToken a su consulta de GraphQL.

Consulta de ejemplo:

query MyQuery {
  listEmployees{
    items {
      id
      name
      company
    }
    nextToken
  }
}

Nota: El valor nextToken que devuelve la consulta es null (nulo) o una cadena larga que comienza con ey y termina con =. Este valor representa la última clave evaluada. Si el valor es null, no hay más elementos en la tabla para evaluar. Si es una cadena larga, hay más elementos para evaluar.

Por ejemplo:

"nextToken": "eyJ2ZXJzaW9uIjoyLCJ0b2tlbiI6IkFRSUNBSGg5OUIvN3BjWU41eE96NDZJMW5GeGM4WUNGeG1acmFOMUpqajZLWkFDQ25BRkQxUjREaVVxMkd1aDZNZ2ZTMmhPMUFBQUNIVENDQWhrR0NTcUdTSWIzRFFFSEJxQ0NBZ293Z2dJR0FnRUFNSUlCL3dZSktvWklodmNOQVFjQk1CNEdDV0NHU0FGbEF3UUJMakFSQkF4c0RFY1ZZUGpaRDFxbDcxNENBUkNBZ2dIUWkwaGtJYytoU04vRFMzL3VQT2ZDMnpIV1dBVkg4LzU3TWFwMGZWSHVackt1VmV4emRvTVQrNml6VC9RdDRsSVNGN1pmc3NWTHVvcnJpRE1RZVE5ckNyd3J4dmNOY3ZZUzhTc21PRFFkaTUreVhQcDJ1OENaK29Sd2wrV3VoOGJ0YlBpQXQydjRNdmw2L09jRzRHV2RxRmFjeTFDRjRyK2FPd29velRTV3NqMTd4OUpwVi93cHVYc2tTN2R5TmYxa3JJS3hSL3BMWlY5M3JPSlVocEpDV2xEL3Y1UU5JdGJoOWpyaTI3N09LbUZsVlh3bDRna3hDa1kzeGZMNjZrM2dZY0hpbHlUOE1GUnBLU0VCTFE3RGEzSlJtUG8xUkJvQ051K3dBTkwwd09Vckp0N1BFb0QvTVRrenZDV1lCTXhVaUhaRDdrM3Y5a2FJS2NScHY0ajhuTDJ2Nk9EZ3plTjgwN1RtRFViM21rRUsrakRRcjUvd3ZQVW56cGFaN1RnR21yT21FaTlGQklOUnl6dk9rdDRWazZEaVU3RCtNYUJSdm5iNnR0VklPa2lDdFlhODRqenhlOFlFRUZGOElyTksrQm9yL28vdktxMVczSUxsU1VWWFd0N0hPWjV4TDBudHVTeGlBdW9ZK1Y0NEkzMXlPQkJ1T1AwMVpUek1TdGUvZCtIT1RRUEt2SGVGanF5Y0tpNGNTQUdZN3BobGs5eWJJem9hOTM0YldJOUFyRmF0WDY4UnkzTkF4cWNCbzh4ZklxZGZNN3Rlam02NldMT0Z6T3F6MDRrK1B0K0lXdWhOeS9CWEN2YXh2dk09In0="

Para obtener el resto de los elementos de la tabla, ejecute otra consulta con nextToken como variable de consulta. Siga incluyendo la variable nextToken hasta que se hayan evaluado todos los elementos.

Consulta de ejemplo:

query MyQuery {
  listEmployees(nextToken:"eyJ......="){
    items {
      id
      name
      company
    }
    nextToken
  }
}

Indexar los datos

En la siguiente consulta de ejemplo, la expresión de filtro se establece para devolver un número de elementos que se basan en empleados de AnyCompany:

query MyQuery {
  listEmployees(filter: {company: {eq: "AnyCompany"}}) {
    items {
      id
      name
      company
    }
    nextToken
  }
}

Para enumerar todos los empleados de la empresa, cree un índice secundario global para el campo en el que desea realizar la consulta. Por ejemplo, en Amplify, puede utilizar ladirectiva @index para definir índices secundarios:

type Employee @model{
  id:ID
  name : String
  email : AWSEmail
  company: String @index(name:"employeeByCompany", queryField: "listEmployeesByCompany")
}

En la siguiente consulta de ejemplo, se establece un índice secundario global employeeByCompany para el campo Company (Empresa) y la consulta se define como listEmployeesByCompany:

query MyQuery {
  listEmployeesByCompany(company: "AnyCompany") {
    items {
      id
      name
      company
    }
    nextToken
  }
}

Puede especificar una variable de límite para devolver el número deseado de elementos en la base de datos. Por ejemplo, en la siguiente consulta, la variable de límite se establece en 5:

query MyQuery {
  listEmployeesByCompany(company: "AnyCompany",limit:5) {
    items {
      id
      name
      company
    }
    nextToken
  }
}

Nota: Al establecer una variable de límite, solo se devuelve el número deseado de elementos, incluso si se han aplicado filterExpressions adicionales. Por ejemplo, en la siguiente consulta, la variable de límite se establece en 5 y el filtro es Mary Major:

query MyQuery {
  listEmployeesByCompany(company: "AnyCompany",limit:5) {
    name:{
      eq:"Mary Major"
    }
  }) {
    items {
      id
      name
      company
    }
    nextToken
  }
}

La consulta anterior devuelve solo 5 elementos iguales a Mary Major. Sin embargo, puede haber más de 5 Mary Major.

Nota: Las consultas indexadas también devuelven un máximo de 1 MB de datos cada vez. Para consultas indexadas más grandes, puede utilizar la paginación.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?