如何以遞減順序查詢 DynamoDB
DynamoDB 的 Query 預設會以遞增的 sort key 順序傳回項目。但大多數「給我最新的」這類
存取模式想要的正好相反 — 最新者優先。控制旋鈕是 Query 上的單一布林值:
ScanIndexForward。把它設為 false,同一個查詢就會反向讀取該 partition。
它只是一個參數,卻常絆倒人,因為它容易與事後對結果排序(DynamoDB 並不做這件事)搞混, 而且這個名稱讀起來和它所控制的東西方向相反。
如何以遞減順序查詢 DynamoDB?
在 Query 上設定 ScanIndexForward=false。DynamoDB 預設以遞增的 sort key 順序傳回項目;翻轉這個單一布林值就能反向讀取 partition,讓 sort key 為時間戳記或序號時呈現最新者優先的結果。它只改變排序,不影響哪些項目相符,而且反向讀取的費用與正向完全相同。
ScanIndexForward=true(預設) → 遞增的 sort key 順序。ScanIndexForward=false→ 遞減順序 — 當你的 sort key 是時間戳記或序號時即為 最新者優先。- 它只影響排序,不影響哪些項目相符 — 那仍由鍵條件決定。
- 它是免費的。 反向順序與正向花費相同;DynamoDB 無論如何都讀取 partition 既有的 儲存順序。
- 搭配
Limit使用,以一次便宜的讀取取得「最新的 N 筆」。
問題:「先給我看最新的」
假設你經營一個多人遊戲排行榜,把每位玩家的分數事件存在單一 partition key 之下,並依一個 遞增的時間戳記排序:
PK: GAME#42 SK: SCORE#2026-06-27T10:00:00Z points
PK: GAME#42 SK: SCORE#2026-06-27T10:05:00Z points
PK: GAME#42 SK: SCORE#2026-06-27T10:09:00Z points儀表板需要最近的分數。對 GAME#42 做一個普通的 Query 會以最舊者優先傳回它們,因此
你可能會想把全部讀出來,再在你的應用程式裡反轉 — 既浪費,而且一旦你加上 Limit 就會壞
掉。DynamoDB 可以直接以最新者優先把它們交回給你。
ScanIndexForward 如何運作
partition 中的項目實際上是依 sort key 排序儲存的。一個 Query 會走過那個順序;
ScanIndexForward 只是挑選走訪的方向:
true(預設) — 從最低的 sort key 開始,往上走(遞增)。false— 從最高的 sort key 開始,往下走(遞減)。
關鍵在於,這是讀取的屬性,而非表格的 — 同樣的項目、同樣的鍵條件,只是反過來。而且
因為 DynamoDB 只是在已排序的資料上選一個方向,遞減讀取
與遞增一樣便宜。
把它與 Limit=10 搭配,你就能用一個單一、成本最低的 Query 取得「最近的 10 筆分數事件」。
一個細微之處:當你在一個遞減的結果集中往回分頁時,
LastEvaluatedKey/ExclusiveStartKey 游標仍然有效 — 只要在同一次掃描的每一頁都一致地
維持 ScanIndexForward=false,否則游標方向會與順序相互矛盾。
在 DynoTable 中建構查詢
若要自己組裝鍵條件(並查看相符的屬性名稱/值映射),請使用 DynamoDB 表達式建構器。
在 DynoTable 中,你透過選定的鍵讀取一個分頁,並用分頁上的開關設定排序方向 — 不必手寫
ScanIndexForward。切換開關以預覽最新者優先的結果。

陷阱與後續步驟
ScanIndexForward是反轉,不是依任意屬性排序。 順序永遠是依 sort key — 要依其他東西排序,你需要把那個屬性當作 sort key(通常透過一個 GSI)。- 別在你的應用程式裡先全部讀出再反轉 — 設定旗標並加上
Limit。 - 在一個多頁掃描中分頁時保持旗標一致,否則游標會與順序相互拉扯。
- 想要數字的最新者優先嗎? 確保 sort key 排序正確 — 為數字補零,讓字典順序與之相符。
- 相關: sort key 策略與 分頁。
想在不碰 API 參數的情況下翻轉結果順序嗎? 下載 DynoTable,直接查詢你的表格。


