Menengah4 menit baca

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.

  • #name menggantikan nama atribut melalui ExpressionAttributeNames — gunakan itu setiap kali suatu atribut berbenturan dengan kata yang dicadangkan atau berisi titik/spasi.
  • :value mengganti nilai melalui ExpressionAttributeValues — DynamoDB tidak pernah memasukkan literal ke dalam teks ekspresi, jadi setiap nilai adalah pengganti.
  • Mereka tidak dapat dipertukarkan. # tempat : berada adalah a ValidationException, 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:

AtributDisimpan?Apa yang dimilikinya
statusYadraft / published
nameYanama tampilan penulis
sizeYapanjang byte yang dirender
ttlYamasa berlaku arsip (epoch)
slugTIDAKSiput 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:

Bangun request Anda
Kode yang dihasilkan
new QueryCommand({
  "TableName": "AuditLog",
  "KeyConditionExpression": "#hashKey = :hashKeyValue",
  "FilterExpression": "#filter0 = :filterValue0",
  "ExpressionAttributeNames": {
    "#hashKey": "pk",
    "#filter0": "status"
  },
  "ExpressionAttributeValues": {
    ":hashKeyValue": {
      "S": "TENANT#acme"
    },
    ":filterValue0": {
      "S": "active"
    }
  }
})

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
Penggantiatribut namaatribut nilai
PetaExpressionAttributeNamesExpressionAttributeValues
Awalan#:
Diperlukan untukkata-kata khusus, titik, spasiselalu — tidak ada literal sebaris
Salah satu kesalahanValidationExceptionValidationException

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 :v setelah 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.

Diperbarui