Warum geben meine Listenabfragen die falsche Anzahl von Elementen zurück, wenn ich DynamoDB mit AWS AppSync verwende?

Lesedauer: 4 Minute
0

Meine Listenabfragen geben die falsche Anzahl von Elementen zurück, wenn ich Amazon DynamoDB mit AWS AppSync verwende. Wie kann ich dies beheben?

Kurzbeschreibung

Wenn Sie eine Listenabfrage mit AWS AppSync und Amazon DynamoDB verwenden, führt DynamoDB einen Scan für die Tabelle durch und gibt eine bestimmte Anzahl von bewerteten Elementen zurück. Wenn Sie einen FilterExpression-Vorgang für die Anforderung angeben, wendet DynamoDB die FilterExpression nur auf diese ausgewerteten Elemente an.

Die Anzahl der Elemente, die der Scan überprüft, hängt von der Grenzvariablen ab, die Sie auf die Abfrage angewendet haben. Wenn keine Grenze angewendet wird, verwendet DynamoDB die Standardgrenze, der in der Anfragezuordnungsvorlage konfiguriert ist. Der Scan gibt nur die Elemente zurück, die ausgewertet wurden und mit dem Filterausdruck übereinstimmen. Um die erwartete Anzahl von Elementen zurückzugeben, müssen Sie die Grenzvariable anpassen.

Sie können die Standardgrenze in Ihrer Mapping-Vorlage erhöhen oder eine Grenzvariable zur GraphQL-Listenabfrage hinzufügen. Die maximale Anzahl von Elementen, die Sie auswerten können, beträgt jedoch 1 MB. Wenn Ihr Scan-Vorgang 1 MB an Daten überschreitet, können Sie die Paginierung verwenden, um den Rest der Daten abzurufen. Damit Sie eine Datenbank mit Tausenden von Elementen abfragen können, können Sie Ihre Daten indizieren, um Ergebnisse nach einem gemeinsamen Feld zu filtern.

Auflösung

Erhöhen der Standardgrenze

In der folgenden Beispiel-Mapping-Vorlage für eine von AWS Amplify generierte API ist die Standardgrenze 100:

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

Um mehr Elemente auszuwerten, ändern Sie die Standardgrenze in der Mapping-Vorlage. Oder fügen Sie der Listenabfrage eine Grenzvariable hinzu. In der folgenden Listenabfrage ist die Grenze zum Beispiel auf 1 000 festgelegt:

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

Paginieren mit AWS AppSync

Um mit AWS AppSync zu paginieren, fügen Sie Ihrer GraphQL-Abfrage ein nextToken-Argument hinzu.

Beispielabfrage:

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

Hinweis: Der nextToken-Wert, den die Abfrage zurückgibt, ist entweder null oder eine lange Zeichenfolge, die mit ey beginnt und mit = endet. Dieser Wert stellt den zuletzt ausgewerteten Schlüssel dar. Wenn der Wert null ist, gibt es in der Tabelle keine weiteren auszuwertenden Elemente. Wenn es sich um eine lange Zeichenfolge handelt, müssen weitere Elemente ausgewertet werden.

Zum Beispiel:

"nextToken": "eyJ2ZXJzaW9uIjoyLCJ0b2tlbiI6IkFRSUNBSGg5OUIvN3BjWU41eE96NDZJMW5GeGM4WUNGeG1acmFOMUpqajZLWkFDQ25BRkQxUjREaVVxMkd1aDZNZ2ZTMmhPMUFBQUNIVENDQWhrR0NTcUdTSWIzRFFFSEJxQ0NBZ293Z2dJR0FnRUFNSUlCL3dZSktvWklodmNOQVFjQk1CNEdDV0NHU0FGbEF3UUJMakFSQkF4c0RFY1ZZUGpaRDFxbDcxNENBUkNBZ2dIUWkwaGtJYytoU04vRFMzL3VQT2ZDMnpIV1dBVkg4LzU3TWFwMGZWSHVackt1VmV4emRvTVQrNml6VC9RdDRsSVNGN1pmc3NWTHVvcnJpRE1RZVE5ckNyd3J4dmNOY3ZZUzhTc21PRFFkaTUreVhQcDJ1OENaK29Sd2wrV3VoOGJ0YlBpQXQydjRNdmw2L09jRzRHV2RxRmFjeTFDRjRyK2FPd29velRTV3NqMTd4OUpwVi93cHVYc2tTN2R5TmYxa3JJS3hSL3BMWlY5M3JPSlVocEpDV2xEL3Y1UU5JdGJoOWpyaTI3N09LbUZsVlh3bDRna3hDa1kzeGZMNjZrM2dZY0hpbHlUOE1GUnBLU0VCTFE3RGEzSlJtUG8xUkJvQ051K3dBTkwwd09Vckp0N1BFb0QvTVRrenZDV1lCTXhVaUhaRDdrM3Y5a2FJS2NScHY0ajhuTDJ2Nk9EZ3plTjgwN1RtRFViM21rRUsrakRRcjUvd3ZQVW56cGFaN1RnR21yT21FaTlGQklOUnl6dk9rdDRWazZEaVU3RCtNYUJSdm5iNnR0VklPa2lDdFlhODRqenhlOFlFRUZGOElyTksrQm9yL28vdktxMVczSUxsU1VWWFd0N0hPWjV4TDBudHVTeGlBdW9ZK1Y0NEkzMXlPQkJ1T1AwMVpUek1TdGUvZCtIT1RRUEt2SGVGanF5Y0tpNGNTQUdZN3BobGs5eWJJem9hOTM0YldJOUFyRmF0WDY4UnkzTkF4cWNCbzh4ZklxZGZNN3Rlam02NldMT0Z6T3F6MDRrK1B0K0lXdWhOeS9CWEN2YXh2dk09In0="

Um den Rest der Elemente in der Tabelle abzurufen, führen Sie eine weitere Abfrage mit dem nextToken als Abfragevariable aus. Nehmen Sie weiterhin die Variable NextToken auf, bis alle Elemente ausgewertet wurden.

Beispielabfrage:

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

Indizieren Ihrer Daten

In der folgenden Beispielabfrage wird der Filterausdruck so festgelegt, dass er eine Reihe von Elementen zurückgibt, die auf Mitarbeitern basieren, die AnyCompany entsprechen:

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

Um alle Mitarbeiter basierend auf ihrem Unternehmen aufzulisten, erstellen Sie einen globalen sekundären Index für das Feld, gegen das abgefragt werden soll. In Amplify können Sie beispielsweise die @index -Direktive verwenden, um Sekundärindexe zu definieren:

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

In der folgenden Beispielabfrage wird ein GSI employeeByCompany für das Feld Unternehmen festgelegt, und die Abfrage ist als listEmployeesByCompany definiert:

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

Sie können eine Grenzvariable angeben, um eine beabsichtigte Anzahl von Elementen in der Datenbank zurückzugeben. In der folgenden Abfrage ist die Grenzvariable zum Beispiel auf 5 festgelegt:

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

Hinweis: Durch das Festlegen einer Grenzvariablen wird nur die vorgesehene Anzahl von Elementen zurückgegeben, selbst wenn Sie zusätzliche filterExpressions angewendet haben. In der folgenden Abfrage ist die Grenzvariable zum Beispiel auf 5 gesetzt und der Filter entspricht Mary Major:

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

Die vorherige Abfrage gibt nur 5 Elemente zurück, die Mary Major entsprechen. Es könnte jedoch mehr als 5 Mary Majors geben.

Hinweis: Indizierte Abfragen geben auch maximal 1 MB an Daten gleichzeitig zurück. Für größere indizierte Abfragen können Sie eine Paginierung verwenden.


AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren