ValidationException: Query condition missed key schema element

TL;DR — KeyConditionExpression Anda wajib memuat kesetaraan (=) pada partition key. Kalau Anda ingin melakukan Query berdasarkan atribut non-key, Anda butuh Query pada GSI/LSI yang memakai atribut itu sebagai key-nya — atau sebuah Scan dengan FilterExpression.

Apa artinya

Pesan lengkapnya biasanya:

ValidationException: Query condition missed key schema element: pk

Nama setelah titik dua adalah atribut partition key tabel Anda, jadi nama itu berbeda-beda.

Query hanya bekerja terhadap sebuah key. DynamoDB memberi tahu Anda bahwa KeyConditionExpression entah sama sekali tidak memuat partition key, atau menyebut atribut yang bukan partition/sort key dari tabel (atau dari index yang Anda Query).

Mengapa itu terjadi

  • KeyConditionExpression memfilter atribut biasa (misalnya email, status) alih-alih partition key.
  • Anda melakukan Query pada tabel dasar padahal atribut itu hanya menjadi key di sebuah GSI — Anda lupa IndexName.
  • Partition key-nya ada tetapi dengan operator selain = (partition key harus cocok persis; hanya sort key yang mendukung <, >, begins_with, between).
  • Salah ketik pada nama atribut sehingga tidak lagi cocok dengan schema.

Bagaimana cara memperbaikinya

  1. Lakukan Query pada partition key dengan =. Setiap Query butuh pk = :pk (memakai nama key asli tabel Anda).
  2. Perlu Query berdasarkan atribut non-key? Buat GSI dengan atribut itu sebagai partition key-nya dan kirimkan IndexName.
  3. Hanya butuh akses sesekali? Pakai Scan dengan FilterExpression alih-alih Query — tapi ingat Scan membaca seluruh tabel.

Contoh

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

Apa arti "Query condition missed key schema element"? KeyConditionExpression Anda entah sama sekali tidak memuat partition key atau menyebut atribut yang bukan partition atau sort key dari tabel maupun index yang Anda Query. Setiap Query butuh kondisi kesetaraan pada partition key.

Bagaimana cara melakukan Query DynamoDB berdasarkan atribut non-key? Buat GSI dengan atribut itu sebagai partition key-nya dan kirimkan IndexName di dalam Query — atau, untuk akses sesekali, pakai Scan dengan FilterExpression, sambil mengingat bahwa Scan membaca seluruh tabel.

Cara mereproduksinya

Sebuah Query yang kondisinya hanya menyebut sort key:

await client.send(
  new QueryCommand({
    TableName: 'orders',
    KeyConditionExpression: 'sk = :s',
    ExpressionAttributeValues: {':s': {S: 'META'}}
  })
);

Keluaran sebenarnya:

ValidationException: Query condition missed key schema element
HTTP 400

Setiap Query harus memaku tepat satu partition key. Keinginan mencari berdasarkan sort key saja adalah tanda klasik bahwa pola akses itu butuh GSI ketimbang Query — atau, kalau Anda memang harus membaca setiap partisi, sebuah Scan.

Kesalahan terkait

Referensi

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Direproduksi 2026-07-26 terhadap DynamoDB Local 2.x dengan AWS SDK for JavaScript v3.1095.0 — keluaran di atas dikutip apa adanya.

Bekerja dengan DynamoDB tanpa Console

Klien desktop DynamoDB yang cepat dan menjalankan SQL sungguhan yang tidak bisa dijalankan DynamoDB — JOINs, GROUP BY, agregasi — dengan editing visual dan agen AI pada kunci Bedrock milik Anda sendiri.

Uji coba gratis 30 hari, tanpa kartu kredit — lalu paket Free tanpa batas waktu.