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: pk

Der 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 KeyConditionExpression filtert 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 IndexName vergessen.
  • 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

  1. Frage auf dem Partitionsschlüssel mit = ab. Jede Query braucht pk = :pk (mit dem echten Schlüsselnamen deiner Tabelle).
  2. Musst du nach einem Nicht-Schlüssel-Attribut abfragen? Erstelle einen GSI mit diesem Attribut als Partitionsschlüssel und übergib IndexName.
  3. Brauchst du nur gelegentlichen Zugriff? Nutze Scan mit einer FilterExpression statt Query — 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 400

Jede 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

Referenzen

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.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.