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: pkNama 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
KeyConditionExpressionmemfilter atribut biasa (misalnyaemail,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
- Lakukan Query pada partition key dengan
=. Setiap Query butuhpk = :pk(memakai nama key asli tabel Anda). - Perlu Query berdasarkan atribut non-key? Buat GSI dengan atribut itu sebagai partition key-nya dan kirimkan
IndexName. - Hanya butuh akses sesekali? Pakai
ScandenganFilterExpressionalih-alihQuery— 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 400Setiap 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
- Elemen kunci yang diberikan tidak cocok dengan skema
- ValidationException (ikhtisar)
- Contoh kode: Query di Node.js · di Python (boto3) — KeyConditionExpression yang ditulis benar.
- Pelajari: Query vs Scan · Key condition expression
Referensi
- Query — Amazon DynamoDB API Reference
- Reserved words in DynamoDB — Amazon DynamoDB Developer Guide
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
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.