Perché le query dell'elenco restituiscono un numero errato di elementi quando utilizzo DynamoDB con AWS AppSync?

Ultimo aggiornamento: 22/06/2022

Le mie query dell'elenco restituiscono il numero errato di elementi quando utilizzo Amazon DynamoDB con AWS AppSync. Come posso risolvere questo problema?

Breve descrizione

Quando utilizzi una query dell'elenco con AWS AppSync e Amazon DynamoDB, DynamoDB esegue un'operazione di scansione sulla tabella e restituisce un determinato numero di elementi valutati. Se fornisci un'operazione FilterExpression sulla richiesta, DynamoDB applica FilterExpression solo a questi elementi valutati.

Il numero di elementi controllati dalla scansione dipende dalla variabile limite che hai applicato alla query. Se non applichi alcun limite, DynamoDB utilizza quello predefinito configurato nel modello di mappatura delle richieste. La scansione restituisce solo gli elementi valutati e che corrispondono all'espressione di filtro. Per restituire il numero previsto di articoli, devi modificare la variabile limite.

Puoi aumentare il limite predefinito sul modello di mappatura o aggiungere una variabile limite alla query GraphQL dell'elenco. Tuttavia, il numero massimo di elementi che è possibile valutare è di 1 MB. Se l'operazione di scansione supera 1 MB di dati, puoi allora utilizzare l'impaginazione per ottenere il resto dei dati. Per semplificare le query su un database che contiene migliaia di elementi, puoi indicizzare i dati per filtrare i risultati in base a un campo comune.

Risoluzione

Aumenta il limite di default

Nel seguente modello di mappatura di esempio per un'API generata da AWS Amplify, il limite di default è 100:

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

Per valutare più elementi, modifica il limite di default nel modello di mappatura. Oppure, aggiungi una variabile limite alla query dell'elenco. Ad esempio, nella seguente query dell'elenco, il limite è impostato su 1000:

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

Esegui l'impaginazione con AWS AppSync

Per eseguire l'impaginazione con AWS AppSync, aggiungi un argomento nextToken alla tua query GraphQL.

Query di esempio:

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

Nota: il valore nextToken restituito dalla query è null o una stringa lunga che inizia con ey e termina con =. Questo valore rappresenta l'ultima chiave valutata. Se il valore è null, non ci sono allora altri elementi da valutare nella tabella. Se è una stringa lunga, ci sono altri elementi da valutare.

Ad esempio:

"nextToken": "eyJ2ZXJzaW9uIjoyLCJ0b2tlbiI6IkFRSUNBSGg5OUIvN3BjWU41eE96NDZJMW5GeGM4WUNGeG1acmFOMUpqajZLWkFDQ25BRkQxUjREaVVxMkd1aDZNZ2ZTMmhPMUFBQUNIVENDQWhrR0NTcUdTSWIzRFFFSEJxQ0NBZ293Z2dJR0FnRUFNSUlCL3dZSktvWklodmNOQVFjQk1CNEdDV0NHU0FGbEF3UUJMakFSQkF4c0RFY1ZZUGpaRDFxbDcxNENBUkNBZ2dIUWkwaGtJYytoU04vRFMzL3VQT2ZDMnpIV1dBVkg4LzU3TWFwMGZWSHVackt1VmV4emRvTVQrNml6VC9RdDRsSVNGN1pmc3NWTHVvcnJpRE1RZVE5ckNyd3J4dmNOY3ZZUzhTc21PRFFkaTUreVhQcDJ1OENaK29Sd2wrV3VoOGJ0YlBpQXQydjRNdmw2L09jRzRHV2RxRmFjeTFDRjRyK2FPd29velRTV3NqMTd4OUpwVi93cHVYc2tTN2R5TmYxa3JJS3hSL3BMWlY5M3JPSlVocEpDV2xEL3Y1UU5JdGJoOWpyaTI3N09LbUZsVlh3bDRna3hDa1kzeGZMNjZrM2dZY0hpbHlUOE1GUnBLU0VCTFE3RGEzSlJtUG8xUkJvQ051K3dBTkwwd09Vckp0N1BFb0QvTVRrenZDV1lCTXhVaUhaRDdrM3Y5a2FJS2NScHY0ajhuTDJ2Nk9EZ3plTjgwN1RtRFViM21rRUsrakRRcjUvd3ZQVW56cGFaN1RnR21yT21FaTlGQklOUnl6dk9rdDRWazZEaVU3RCtNYUJSdm5iNnR0VklPa2lDdFlhODRqenhlOFlFRUZGOElyTksrQm9yL28vdktxMVczSUxsU1VWWFd0N0hPWjV4TDBudHVTeGlBdW9ZK1Y0NEkzMXlPQkJ1T1AwMVpUek1TdGUvZCtIT1RRUEt2SGVGanF5Y0tpNGNTQUdZN3BobGs5eWJJem9hOTM0YldJOUFyRmF0WDY4UnkzTkF4cWNCbzh4ZklxZGZNN3Rlam02NldMT0Z6T3F6MDRrK1B0K0lXdWhOeS9CWEN2YXh2dk09In0="

Per ottenere il resto degli elementi nella tabella, esegui un'altra query con nextToken come variabile di query. Continua a includere la variabile nextToken finché non sono stati valutati tutti gli elementi.

Query di esempio:

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

Indicizza i tuoi dati

Nella seguente query di esempio, l'espressione di filtro è impostata per restituire un numero di elementi basati su dipendenti uguale a AnyCompany:

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

Per elencare tutti i dipendenti in base all'azienda, crea un indice secondario globale per il campo su cui eseguire la query. Ad esempio, in Amplify, è possibile utilizzare la direttiva @index per definire gli indici secondari:

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

Nella seguente query di esempio, una GSI employeeByCompany viene impostata per il campo azienda e la query è definita come listEmployeesByCompany:

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

Puoi specificare una variabile limite per restituire il numero desiderato di elementi nel database. Ad esempio, nella seguente query, la variabile limite è impostata su 5:

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

Nota: l'impostazione di una variabile limite restituisce solo il numero desiderato di elementi, anche se hai applicato ulteriori filterExpressions. Ad esempio, nella query seguente, la variabile limite è impostata su 5 e il filtro è uguale a Mary Major:

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

La query precedente restituisce solo 5 elementi uguali a Mary Major. Tuttavia, potrebbero esserci più di 5 Mary Major.

Nota: le query indicizzate restituiscono anche un massimo di 1 MB di dati alla volta. Per le query indicizzate più grandi, è possibile utilizzare l'impaginazione.


Questo articolo è stato utile?


Hai bisogno di supporto tecnico o per la fatturazione?