DynamoDB ReturnValues: Dapatkan Item Lama atau Baru
Secara default, penulisan DynamoDB hanya menghasilkan kesuksesan. Namun Anda sering kali membutuhkan datanya
sekitar penulisan — nilai sebelum Anda mengubahnya, atau nilai baru setelahnya. Itu
perbaikan naif adalah GetItem kedua, yang merupakan perjalanan pulang pergi ekstra dan perlombaan: seseorang
lain bisa menulis di antaranya. DynamoDB menghindari keduanya dengan parameter ReturnValues,
yang mengembalikan item lama atau baru secara atom sebagai bagian dari penulisan itu sendiri.
Apa yang dilakukan ReturnValues di DynamoDB?
ReturnValues memberitahukan penulisan DynamoDB untuk menyerahkan kembali item tersebut sebagai bagian dari panggilan yang sama, sehingga Anda melewatkan GetItem kedua dan balapan yang dibuatnya. PutItem dan DeleteItem menerima NONE atau ALL_OLD; UpdateItem menerima kelimanya (NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW), mengembalikan nilai lama atau baru secara atom.
ReturnValuesmengembalikan item sebagai bagian dari penulisan — tidak ada pembacaan kedua, tidak ada balapan.NONE(default) — tidak mengembalikan apa pun.ALL_OLD— keseluruhan item seperti sebelum penulisan.UPDATED_OLD— hanya atribut yang diperbarui, nilai before.ALL_NEW— keseluruhan item setelah penulisan.UPDATED_NEW— hanya atribut yang diubah, nilai after.PutItem/DeleteItemhanya menerimaNONEatauALL_OLD;UpdateItemmenerima semua lima.
Masalahnya: Anda memerlukan nilai yang baru saja Anda timpa
Katakanlah Anda menjalankan meja dukungan dan agen mengubah status tiket dari open menjadi
pending. Log audit Anda perlu mencatat status sebelum perubahan.
Tanpa ReturnValues Anda akan:
GetItemuntuk membaca status saat ini,UpdateItemuntuk mengatur yang baru.
Antara langkah 1 dan 2 agen lain dapat mengubah status — sekarang catatan log audit Anda
nilai "sebelum" yang basi. Lebih buruk lagi, ini adalah dua panggilan untuk satu operasi logis. ReturnValues
meruntuhkannya menjadi satu atom UpdateItem yang mengembalikan status lama seperti itu
sebenarnya pada waktu menulis.
Lima opsi, dan kapan menggunakan masing-masing opsi
UpdateItem mendukung set lengkap; pilihannya adalah potongan item yang mana dan yang mana
sisi tulis yang Anda butuhkan:
ReturnValues | Pengembalian | Gunakan ketika |
|---|---|---|
NONE | tidak ada | Anda tidak memerlukan item tersebut kembali (default) |
ALL_OLD | seluruh item, pra-tulis | auditing / "apa yang baru saja saya ganti?" |
UPDATED_OLD | mengubah attr, pra-tulis | anda hanya peduli pada bidang yang anda sentuh |
ALL_NEW | seluruh item, pasca-tulis | Anda memerlukan item lengkap yang baru untuk dikembalikan ke penelepon |
UPDATED_NEW | mengubah attrs, pasca-tulis | membaca kembali counter/value yang baru saja Anda tambahkan |
UPDATED_NEW adalah pahlawan sehari-hari: menambah penghitung dengan
perbarui ekspresi dan baca kembali total yang baru
panggilan yang sama, tidak ada balapan. Untuk audit tiket dukungan, ALL_OLD (atau UPDATED_OLD jika
Anda hanya mencatat bidang status) menangkap status pra-perubahan secara atom.
Perhatikan asimetrinya: PutItem dan DeleteItem hanya mendukung NONE dan ALL_OLD —
tidak ada nilai "baru" yang dapat dikembalikan untuk penghapusan, dan nilai baru dari put adalah nilai Anda
dikirim. Hanya UpdateItem, yang bermutasi di tempat, yang menawarkan kelimanya.
Dokumen AWS
matriks yang tepat.
Menulis pembaruan di DynoTable
Rakit UpdateItem dan ekspresi pembaruannya secara visual dengan
Pembuat ekspresi DynamoDB — ia memancarkan
Klausa SET/ADD ditambah nama atribut dan peta nilai. Di aplikasi, DynoTable
menunjukkan item yang dihasilkan setelah penulisan bertahap dilakukan, sehingga Anda melihat status baru
secara langsung.
<gambar kelas="doc-media-placeholder" jenis data="tangkapan layar" data-src="docs/guide-dynamodb-returnvalues-update.png"
Jebakan + langkah selanjutnya
- Jangan
GetItem-lalu-menulis untuk membaca perubahan — ini adalah perjalanan pulang pergi dan balapan; gunakanReturnValues. UPDATED_*hanya mengembalikan atribut yang disentuh — jika Anda membutuhkan seluruh item, gunakanALL_*.PutItem/DeleteItemtidak dapat mengembalikan nilai baru — hanyaNONE/ALL_OLD.ReturnValuesbukan pengganti suatu kondisi — untuk guard menulis, tambahkan a ekspresi kondisi; untuk membaca kembali nya efeknya, gunakanReturnValues. Mereka menulis.- Terkait: perbarui ekspresi, penghitung atom.
Ingin mengedit dan melihat before/after tanpa membuat skrip dua panggilan? Unduh DynoTable dan edit item Anda secara langsung.
Penghitung atom dengan UPDATED_NEW
Sistem inventaris menambah bidang version atau stock pada setiap penulisan. Itu
polanya adalah satu UpdateItem dengan ADD stock :inc dan ReturnValues: UPDATED_NEW:
UpdateItem PK=SKU#8842
UpdateExpression: ADD stock :one
ExpressionAttributeValues: {":one": {"N": "1"}}
ReturnValues: UPDATED_NEW
→ Attributes.stock.N == "41" (was 40)Anda hanya menerima peta atribut yang diubah, bukan item lengkap — idealnya saat
itemnya besar tetapi penelepon membutuhkan counter baru. Untuk jalur audit itu harus
tangkap setiap bidang sebelum diubah, beralih ke ALL_OLD.
Penulisan masih ditagih sebagai UpdateItem pada ukuran item; ReturnValues melakukannya
tidak menambahkan biaya baca terpisah — DynamoDB sudah memuat item untuk diterapkan
memperbarui.
Catatan kapasitas
Mengembalikan atribut tidak menggandakan biaya penulisan WCU itu sendiri. Anda membayar untuk penulisan berdasarkan ukuran barang sebelum dan sesudah update per AWS aturan, terlepas dari berapa banyak atribut yang muncul dalam payload respons.
Jika Anda tergoda untuk GetItem maka UpdateItem mencatat nilai lama, Anda
dibayar untuk membaca dan menulis. ReturnValues: ALL_OLD pada pembaruan menghapus
baca seluruhnya — pada item 2 KB dengan 500 pembaruan per detik yang menghemat sekitar
250 RCU yang pada akhirnya konsisten per detik.
Tulis dengan ekspresi kondisi
ReturnValues dan
ekspresi kondisi tulis di
panggilan yang sama. Contoh: naikkan retryCount hanya saat berada di bawah batas, dan kembalikan
hitungan baru:
ConditionExpression: retryCount < :max
UpdateExpression: ADD retryCount :one
ReturnValues: UPDATED_NEWJika kondisi gagal, DynamoDB mengembalikan ConditionalCheckFailedException dan
tidak ada atribut payload — berbeda dari pembaruan yang berhasil dengan
UPDATED_NEW kosong ketika tidak ada yang berubah.
Gunakan pembuat ekspresi untuk menghasilkan
UpdateExpression, kondisi, dan nilai yang disusun dipetakan bersama.
Panduan pengambilan keputusan
| Anda membutuhkan… | Pengaturan | Bekerja pada |
|---|---|---|
| Tidak ada yang kembali | NONE | Pasang, Perbarui, Hapus |
| Item lengkap sebelum ditimpa/delete | ALL_OLD | Pasang, Perbarui, Hapus |
| Hanya mengubah bidang, sebelum | UPDATED_OLD | Pembaruan |
| Item lengkap setelah patch | ALL_NEW | Pembaruan |
| Hanya mengubah bidang, setelah | UPDATED_NEW | Pembaruan |
Menghapus dan menempatkan
DeleteItem dengan ReturnValues: ALL_OLD adalah cara Anda menerapkan "pop dan return"
semantik pada item antrian — baris yang dihapus muncul kembali di Attributes. Ada
tidak ada ALL_NEW yang di hapus karena itemnya sudah tidak ada lagi.
PutItem dengan ALL_OLD mengembalikan item sebelumnya ketika Anda menimpa item yang sudah ada
key — berguna untuk alur kerja swap. Jika kuncinya tidak ada, responsnya akan hilang
Attributes.
Verifikasi di DynoTable
Tahapan perubahan atribut di editor item: panel tinjauan menampilkan yang lama dan baru
nilai berdampingan sebelum melakukan — informasi yang sama UPDATED_OLD dan
UPDATED_NEW akan kembali, tanpa menulis skrip. Setelah komit, salin barisnya
sebagai JSON untuk perlengkapan pengujian melalui tindakan ekspor jaringan.