Nama dan Nilai Atribut Ekspresi DynamoDB
Ekspresi DynamoDB adalah templat: Anda menulis placeholder, lalu memberikan yang asli
Nama dan nilai dalam peta dua sisi. #name adalah pengganti nama;
:value adalah pengganti nilai. Buat keduanya bingung dan DynamoDB menolaknya
seluruh panggilan.
Apa perbedaan antara #name dan :value di DynamoDB?
#name adalah pengganti untuk atribut nama, yang disediakan melalui ExpressionAttributeNames; :value adalah pengganti untuk atribut nilai, yang dipasok melalui ExpressionAttributeValues. Gunakan #name untuk menghindari kata, titik, atau spasi yang dicadangkan, dan :value untuk setiap literal — DynamoDB tidak pernah memasukkan nilai. Mereka tidak bisa dipertukarkan; menukarnya akan melempar ValidationException.
#namemenggantikan nama atribut melaluiExpressionAttributeNames— gunakan itu setiap kali suatu atribut berbenturan dengan kata yang dicadangkan atau berisi titik/spasi.:valuemengganti nilai melaluiExpressionAttributeValues— DynamoDB tidak pernah memasukkan literal ke dalam teks ekspresi, jadi setiap nilai adalah pengganti.- Mereka tidak dapat dipertukarkan.
#tempat:berada adalah aValidationException, bukan larangan diam.
Berasal dari SQL, Anda menyejajarkan keduanya — WHERE status = 'published'. sebaris DynamoDB
tidak juga. Perpecahan itu adalah hal yang membuat setiap pendatang baru tersandung.
Mengapa kedua peta itu ada
Di SQL, string kueri membawa segalanya: nama kolom, literal, operator. DynamoDB sengaja memisahkan bentuk ekspresi dari data-nya.
Nilai masuk dalam petanya sendiri sehingga DynamoDB dapat mengetikkan masing-masing nilai (S, N, BOOL,…)
sehingga parser tidak perlu menebak di mana sebuah string berakhir - tidak ada tanda kutip
atau escaping salah. Lihat tipe data di DynamoDB untuk
daftar tag tipe lengkap.
Nama mendapat perlakuan yang sama karena alasan berbeda: DynamoDB memiliki daftar yang panjang kata-kata yang dicadangkan, dan atribut apa pun yang cocok dengan kata tersebut tidak dapat muncul sebagai nama asli dalam sebuah ekspresi. Placeholder menghindari reservasi sepenuhnya.
Perangkap kata-kata yang dilindungi undang-undang
Berikut adalah tabel artikel CMS — kunci partisi BLOG#<blog>, kunci pengurutan
ARTICLE#<slug> - yang atributnya terbaca secara alami tetapi kebetulan bertabrakan
kata-kata khusus:
| Atribut | Disimpan? | Apa yang dimilikinya |
|---|---|---|
status | Ya | draft / published |
name | Ya | nama tampilan penulis |
size | Ya | panjang byte yang dirender |
ttl | Ya | masa berlaku arsip (epoch) |
slug | TIDAK | Siput URL |
status, name, size, dan ttl semuanya ada dalam daftar kata khusus AWS, jadi ini
filter gagal pada kata pertama:
FilterExpression status = :s
DynamoDB mengembalikan ValidationException — "Nama atribut dicadangkan
kata kunci; kata kunci yang dipesan: status". Perbaikannya adalah pengganti nama, tidak pernah
mengganti nama atribut:
FilterExpression #status = :s
ExpressionAttributeNames { "#status": "status" }
ExpressionAttributeValues { ":s": { "S": "published" } }
slug tidak dicadangkan, jadi kueri yang Anda uji terhadap slug berfungsi, dan Anda
berasumsi yang berikutnya juga akan demikian. Kemudian status memecahkannya. Daftar lengkapnya berpindah, jadi
jangan menghafalnya — placeholder setiap nama dan Anda tidak akan pernah digigit.
Petakan setiap nilai, selalu
Nilai tidak dapat dinegosiasikan: tidak ada sintaksis untuk literal inline. Bahkan dataran nomor mendapat pengganti. Pembaruan ini menandai artikel yang diterbitkan, mencapnya ukuran, dan menetapkan arsip 30 hari:
UpdateExpression: SET #status = :s, #size = :sz, #ttl = :exp
ExpressionAttributeNames: { "#status": "status", "#size": "size", "#ttl": "ttl" }
ExpressionAttributeValues: {
":s": { "S": "published" },
":sz": { "N": "20480" },
":exp": { "N": "1719792000" }
}Catatan :sz dan :exp dikirim sebagai string N — tipe nomor DynamoDB adalah kabel-
dikodekan sebagai string. Peta nilai juga merupakan tempat Anda menggunakan kembali suatu nilai
klausa: tentukan :s satu kali, referensikan dalam ConditionExpression dan a
FilterExpression.
Membangun kedua peta ini dengan tangan adalah tempat persembunyian kesalahan ketik. Itu Pembuat Ekspresi menghasilkan ekspresi string dan kedua peta bersama-sama, dengan tag tipe terisi, jadi placeholder tidak bisa keluar dari sinkronisasi.
Pembuat di bawah memfilter status — kata khusus — sehingga Anda dapat melihatnya
alias otomatis ke #status di peta ExpressionAttributeNames:
Nama untuk jalur yang bersarang dan canggung
Placeholder # melakukan lebih dari sekadar menghindari kata-kata khusus. Penggunaan sintaksis jalur dokumen
titik dan tanda kurung, jadi atribut yang secara harfiah berisi titik — misalnya metadata
key og.title — tidak dapat dialamatkan tanpa placeholder:
ProjectionExpression #og
ExpressionAttributeNames { "#og": "og.title" }
Tanpanya, DynamoDB membaca og.title sebagai "bidang title di dalam peta og"
— hal yang sama sekali berbeda. Cerita yang sama untuk nama dengan spasi atau angka di depannya.
Untuk menyusunnya, Anda menempatkan setiap segmen: #meta.#author dengan #meta dan
#author ditentukan.
Nama vs nilai, berdampingan
#name | :value | |
|---|---|---|
| Pengganti | atribut nama | atribut nilai |
| Peta | ExpressionAttributeNames | ExpressionAttributeValues |
| Awalan | # | : |
| Diperlukan untuk | kata-kata khusus, titik, spasi | selalu — tidak ada literal sebaris |
| Salah satu kesalahan | ValidationException | ValidationException |
Jika suatu nilai diketik sebagai nama, DynamoDB akan mencari atribut yang dipanggil
published dan kondisi Anda tidak akan pernah sesuai dengan yang Anda maksudkan — jadi API
malah gagal dengan keras. Ketegasan itu adalah cirinya: tidak ada jawaban yang salah.
Jebakan dan langkah selanjutnya
- Mendeklarasikan placeholder yang tidak Anda gunakan — DynamoDB menolak entri yang tidak digunakan baik peta. Bangun peta dari ekspresi, bukan dari depan.
- Menggunakan kembali
:vsetelah mengedit ekspresi — menghapus klausa dan nilainya bisa berlama-lama, memicu kesalahan entri yang tidak digunakan. Pembangun menjaga mereka tetap sejajar. - Dengan asumsi sebuah nama aman karena berfungsi sekali — terjadi tabrakan kata yang dicadangkan per-atribut. Placeholder secara seragam dan berhenti menebak-nebak.
Peta-peta ini muncul di setiap jalur penulisan, sehingga berpasangan secara alami desain meja tunggal dan dengan pengetahuan kapan melakukan Kueri vs Pemindaian sebelum Anda memasang filter.
Hasilkan ekspresi ditambah kedua peta dengan Pembuat Ekspresi, lalu coba DynoTable untuk menjalankannya di tabel Anda sendiri dan tonton placeholder menyelesaikannya.