DynamoDB GSI projiziert das angeforderte Attribut nicht
TL;DR — Du hast einen Global Secondary Index abgefragt und (per ProjectionExpression oder Select=ALL_ATTRIBUTES) ein Attribut angefordert, das der Index nicht projiziert. Ein GSI gibt nur seine eigenen Key-Attribute, die Key-Attribute der Basistabelle und alles zurück, was du in seiner Projektion aufgeführt hast — sonst nichts. Grenze entweder die Anfrage auf projizierte Attribute ein, füge das Attribut zur Projektion des GSI hinzu oder frage die Basistabelle per Primärschlüssel ab.
Was es bedeutet
ValidationException: One or more parameter values were invalid: Global secondary
index <index_name> does not project <attribute_name>
# or, with Select=ALL_ATTRIBUTES on a KEYS_ONLY / INCLUDE index:
ValidationException: Select type ALL_ATTRIBUTES is not supported for global
secondary index <index_name> because its projection type is not ALL
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: One or more parameter values were invalid: Global secondary index gsi1 does not project [unprojected]Anders als ein Local Secondary Index (der nicht-projizierte Attribute zu Extrakosten aus dem Basis-Item holen kann) ist ein GSI eine eigenständige Kopie. Er speichert physisch nur die Attribute seiner Projektion — AWS' eigene Doku ist unverblümt: "global secondary index queries cannot fetch attributes from the base table." Eine GSI-Abfrage nach irgendetwas außerhalb dieses Satzes ist nicht erfüllbar, deshalb lehnt DynamoDB die Anfrage ab (eine ValidationException, HTTP 400 — nicht wiederholbar), statt stillschweigend unvollständige Daten zurückzugeben.
Warum es passiert
ProjectionType: KEYS_ONLY-Index, der nach einem Nicht-Key-Attribut abgefragt wird.ProjectionType: INCLUDE-Index, der nach einem Attribut abgefragt wird, das nicht in derNonKeyAttributes-Liste steht.Select: ALL_ATTRIBUTESauf einem GSI, der nichtProjectionType: ALList.- Annahme von LSI-Verhalten — erwarten, dass ein GSI nicht-projizierte Attribute aus der Basistabelle holt (nur LSIs tun das).
- Eine Projektion, die abgedriftet ist von dem, was die Abfrage braucht, während sich das Zugriffsmuster weiterentwickelt hat.
So behebst du es
- Fordere nur projizierte Attribute an — beschränke
ProjectionExpressionauf die Keys des GSI + seinen projizierten Satz, oder lassSelect: ALL_ATTRIBUTESweg. - Füge das Attribut zur GSI-Projektion hinzu — für ein neues Attribut erstelle/ersetze den GSI mit
ProjectionType: INCLUDE(und liste es auf) oderALL. Die Projektionen bestehender GSIs lassen sich nicht in-place bearbeiten; du fügst einen neuen GSI hinzu oder erstellst ihn neu. - Hol aus der Basistabelle — verwende die Keys, die der GSI tatsächlich zurückgibt, um ein
GetItem/BatchGetItemauf der Basistabelle für das vollständige Item durchzuführen. - Verwende
ProjectionType: ALL, wenn du routinemäßig jedes Attribut aus dem Index brauchst (und die zusätzlichen Speicher-/Schreibkosten akzeptierst).
Willst du sehen, welche Attribute ein GSI tatsächlich trägt, bevor du ihn abfragst? Die DynoTable-Desktop-App zeigt die Projektion jedes Index an, sodass du nur anforderst, was vorhanden ist — keine does not project-Überraschung.
Verwandte Fehler
- Index not found — der Indexname selbst ist falsch oder baut noch auf.
- Query condition missed key schema element — die Key-Bedingung des GSI ist unvollständig.
- Code example: Query a GSI in Node.js — eine funktionierende GSI-Abfrage zum Vergleich.
- Learn: Index-Projektionen · GSI vs LSI · Indexes
Referenzen
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Managing Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.