ValidationException: Query condition missed key schema element
TL;DR — Deine KeyConditionExpression muss eine Gleichheit (=) auf dem Partitionsschlüssel enthalten. Wenn du nach einem Nicht-Schlüssel-Attribut abfragst, brauchst du eine Query auf einem GSI/LSI, der dieses Attribut als Schlüssel hat — oder einen Scan mit einer FilterExpression.
Was es bedeutet
Die vollständige Meldung lautet meist:
ValidationException: Query condition missed key schema element: pkDer Name nach dem Doppelpunkt ist das Partitionsschlüssel-Attribut deiner Tabelle und variiert deshalb.
Query funktioniert nur gegen einen Schlüssel. DynamoDB sagt dir, dass die KeyConditionExpression entweder den Partitionsschlüssel ganz weglässt oder ein Attribut nennt, das nicht der Partitions-/Sortierschlüssel der Tabelle (oder des abgefragten Index) ist.
Warum es passiert
- Die
KeyConditionExpressionfiltert auf ein reguläres Attribut (z. B.email,status) statt auf den Partitionsschlüssel. - Du fragst die Basistabelle ab, aber das Attribut ist nur auf einem GSI ein Schlüssel — du hast
IndexNamevergessen. - Der Partitionsschlüssel ist vorhanden, aber mit einem anderen Operator als
=(der Partitionsschlüssel muss ein exakter Match sein; nur der Sortierschlüssel unterstützt<,>,begins_with,between). - Ein Tippfehler im Attributnamen, sodass er nicht mehr zum Schema passt.
So behebst du es
- Frage auf dem Partitionsschlüssel mit
=ab. Jede Query brauchtpk = :pk(mit dem echten Schlüsselnamen deiner Tabelle). - Musst du nach einem Nicht-Schlüssel-Attribut abfragen? Erstelle einen GSI mit diesem Attribut als Partitionsschlüssel und übergib
IndexName. - Brauchst du nur gelegentlichen Zugriff? Nutze
Scanmit einerFilterExpressionstattQuery— beachte aber, dass Scan die ganze Tabelle liest.
Beispiel
import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
import {DynamoDBDocumentClient, QueryCommand} from '@aws-sdk/lib-dynamodb';
const doc = DynamoDBDocumentClient.from(new DynamoDBClient({}));
// Query the base table by its partition key:
await doc.send(
new QueryCommand({
TableName: 'Orders',
KeyConditionExpression: 'pk = :pk',
ExpressionAttributeValues: {':pk': 'USER#123'}
})
);
// Query by a non-key attribute → use a GSI that keys on it
// ("status" is a DynamoDB reserved word, so alias it with #status):
await doc.send(
new QueryCommand({
TableName: 'Orders',
IndexName: 'byStatus',
KeyConditionExpression: '#status = :s',
ExpressionAttributeNames: {'#status': 'status'},
ExpressionAttributeValues: {':s': 'SHIPPED'}
})
);FAQ
Was bedeutet "Query condition missed key schema element"? Deine KeyConditionExpression lässt entweder den Partitionsschlüssel ganz weg oder nennt ein Attribut, das nicht der Partitions- oder Sortierschlüssel der Tabelle oder des abgefragten Index ist. Jede Query braucht eine Gleichheitsbedingung auf dem Partitionsschlüssel.
Wie frage ich DynamoDB nach einem Nicht-Schlüssel-Attribut ab?
Erstelle einen GSI mit diesem Attribut als Partitionsschlüssel und übergib IndexName in der Query — oder nutze für gelegentlichen Zugriff einen Scan mit einer FilterExpression, im Hinterkopf behaltend, dass ein Scan die ganze Tabelle liest.
So reproduzierst du es
Eine Query, deren Bedingung nur den Sort Key benennt:
await client.send(
new QueryCommand({
TableName: 'orders',
KeyConditionExpression: 'sk = :s',
ExpressionAttributeValues: {':s': {S: 'META'}}
})
);Echte Ausgabe:
ValidationException: Query condition missed key schema element
HTTP 400Jede Query muss genau einen Partition Key festnageln. Nach dem Sort Key allein suchen zu wollen ist das klassische Zeichen dafür, dass das Zugriffsmuster einen GSI statt einer Query braucht — oder, wenn du wirklich jede Partition lesen musst, einen Scan.
Verwandte Fehler
- The provided key element does not match the schema
- ValidationException (overview)
- Code example: Query in Node.js · in Python (boto3) — eine KeyConditionExpression richtig gemacht.
- Learn: Query vs. Scan · Key-Condition-Expressions
Referenzen
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.
Am 2026-07-26 gegen DynamoDB Local 2.x mit dem AWS SDK for JavaScript v3.1095.0 reproduziert — die Ausgabe oben ist wortgetreu.