DynamoDB — tidak dapat menggunakan parameter ekspresi dan non-ekspresi: "Can Not Use Both Expression and Non-Expression Parameters"
TL;DR — Permintaan Anda menyetel parameter lama (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) dan ekspresi setaranya (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) dalam panggilan yang sama. DynamoDB melarang pencampuran kedua keluarga. Hapus parameter lama dan gunakan ekspresi saja.
Apa artinya
ValidationException: Can not use both expression and non-expression parameters in
the same request: Non-expression parameters: {KeyConditions} Expression
parameters: {KeyConditionExpression}
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Can not use both expression and non-expression parameters in the same request: Non-expression parameters: {KeyConditions} Expression parameters: {KeyConditionExpression}Mengapa itu terjadi
- Kode setengah migrasi — Anda menambahkan
KeyConditionExpressiontetapi meninggalkanKeyConditionslama pada objek params yang sama. - Tabrakan proyeksi —
AttributesToGet(warisan) bersamaProjectionExpression. - Tabrakan filter —
ScanFilter/QueryFilterbersamaFilterExpression. - Tabrakan tulis —
Expected/AttributeUpdatesbersamaConditionExpression/UpdateExpression. - Pustaka pembantu yang memasukkan default lama saat Anda menyetel formulir ekspresi.
Bagaimana cara memperbaikinya
- Hapus parameter lama. Hanya simpan bentuk ekspresi:
KeyConditionExpressionmelaluiKeyConditions,FilterExpressionmelaluiScanFilter/QueryFilter,ProjectionExpressionmelaluiAttributesToGet,ConditionExpression/UpdateExpressionmelaluiExpected/AttributeUpdates. - Pindahkan nilai ke dalam placeholder — nilai sebaris lama menjadi
ExpressionAttributeValues(:v) dan nama /complex yang dicadangkan menjadiExpressionAttributeNames(#n). - Audit seluruh objek parameter — konflik dapat terjadi antara dua masalah yang berbeda (misalnya proyeksi lama + kondisi kunci ekspresi), bukan hanya satu masalah yang sama.
- Pilih ekspresi di mana pun — AWS mempertahankan parameter lama hanya untuk kompatibilitas mundur dan merekomendasikan parameter ekspresi untuk semua kode baru; standarisasi ekspresi menghindari kelas kesalahan ini.
- Hapus default lama dari pustaka pembantu. Beberapa wrapper SDK masih memasukkan
AttributesToGetatauKeyConditionskecuali Anda menonaktifkannya secara eksplisit.
Jalankan di DynoTable
Panel kueri DynoTable hanya menggunakan parameter ekspresi — tidak ada bidang KeyConditions atau ScanFilter lama dalam permintaan yang dihasilkan. Buka tabel dengan ⌘K, buat Kueri atau Pemindaian, lalu salin KeyConditionExpression yang dipancarkan dan peta atribut ke dalam migrasi Anda.
Gunakan Pembuat Kueri untuk membuat prototipe permintaan khusus ekspresi sebelum Anda memfaktorkan ulang kode SDK lama. Penahapan (⌘S) memungkinkan Anda menguji kueri baru terhadap data langsung tanpa melakukan penulisan. Ganti profil dengan ⌘P; konfigurasikan di bawah Pengaturan → Profil dengan Uji Koneksi. Lihat Menghubungkan ke AWS dan Instal. Parameter KeyConditions dan ScanFilter lama tidak muncul di mana pun dalam permintaan yang dibuat DynoTable. Jika pembungkus SDK Anda masih memasukkannya, catat objek params lengkap dan hapus setiap kunci lama sebelum panggilan mencapai DynamoDB.
Sumber
- Parameter kondisional DynamoDB lama (diverifikasi 13-07-2026)
- Kueri — Referensi Amazon DynamoDB API (diverifikasi 13-07-2026)
Kesalahan terkait
- Tidak dapat menentukan proyeksi ketika Select adalah COUNT — kombinasi parameter lain yang saling eksklusif.
- Kondisi kunci kueri tidak didukung — format
KeyConditionExpressionsalah. - Contoh kode: Kueri di Node.js — Kueri khusus ekspresi yang akan dijadikan tujuan migrasi.
- Pelajari: Ekspresi kondisi utama · Nama & nilai ekspresi
Referensi
Parameter kondisional DynamoDB lama — Panduan Pengembang Amazon DynamoDB
Menggunakan ekspresi di DynamoDB — Panduan Pengembang Amazon DynamoDB
Terakhir diverifikasi 2026-07-13 berdasarkan dokumentasi resmi AWS yang ditautkan di atas.