Filter 與查詢模式

每個表格分頁都帶有一個 Filter:DynoTable 會把這個述詞狀態轉換成 DynamoDB 請求。學會這些元件如何對應到 queryscan, 就掌握了讓這款應用程式變快、讓你的帳單變小的大部分訣竅。

本頁說明 Visual 分頁模式。若要直接撰寫 SQL 風格的查詢, 請切換到 PartiQL;若要進行 join 與聚合,請開啟 Workbench

Filter 列

Visual 模式會顯示單一橫向的藥丸列:

[Index] [hashKey = value] [rangeKey op value] [+ filter] | [Clear] [Query/Scan]
  • Index 藥丸 — 你所透過讀取的查詢模式
  • 鍵藥丸 — 該模式的 partition(hash)鍵,以及在有的情況下,sort(range) 鍵。
  • Filter 藥丸 — 額外的非鍵條件(scan 過濾條件)。
  • 動作按鈕會依你所設定的內容顯示 QueryScan, 並在結果開始串流後變成 Load more

設定一個值後 DynoTable 就會自動執行;清除或編輯藥丸後, 只要 Filter 再次有效,就會重新執行。

視覺化 Filter 列:Index 選擇器、鍵藥丸、一個新增的 scan 過濾條件,以及執行按鈕。
視覺化 Filter 列:Index 選擇器、鍵藥丸、一個新增的 scan 過濾條件,以及執行按鈕。

查詢模式

查詢模式就是你所透過讀取的 Index:

  • PRIMARY — 表格自身的 /
  • 具名的 — 其自身的鍵結構。

所選的模式決定了你能對哪些鍵進行 Filter。可從 Index 藥丸切換模式; 鍵藥丸會更新為該模式的 partition key 與 sort key。

Query 與 Scan 的比較

這正是對成本與速度最關鍵的區別:

  • 設定一個 Filter,DynoTable 就會發出 一個精準的 — 它只讀取相符的 partition。又便宜又快。
  • 沒有它的話就會退回 ,逐頁讀取整個表格(或 Index)。 動作按鈕會顯示 Scan,以明確表示這一點。

鍵 Filter

partition key 藥丸接受一個值;一旦設定,動作就會變成 Query。 sort key 藥丸則在其上加入一個比較:

  • =<<=>>= — 有序比較(數字,以及字串的字典序)。
  • begins_with — 對字串或二進位的前綴比對。
  • between — 一個包含端點的範圍;該藥丸會長出第二個值欄位。

字串類型的鍵提供自動完成:當 DynoTable 在背景為表格建立索引時, 它會建議你已經見過的真實值。沒有實用建議的鍵(例如隨機 UUID) 則退回為一般輸入欄位。

Scan Filter

+ filter 藥丸會新增一個非鍵條件 — 任何屬性,而不只是鍵。 每個 Filter 都是一個欄、一個運算子與一個值:

  • 比較:=<<=>>=between
  • 成員關係:in — 比對清單中的任一值(字串或數字)。
  • 字串/二進位:begins_withcontains
  • 存在性:existsnot exists
  • 類型:type equals / type not equals(針對 DynamoDB 類型代碼 — SNBOOL、…),外加一組用於集合類型的 size 系列。

所提供的運算子會因應屬性的類型而調整 — 數字會出現順序比較, 字串會出現 begins_with。Scan Filter 會在 query 或 scan 讀取項目之後 才套用,因此它們會縮小結果,卻不會讓 scan 變便宜。請用鍵 Filter 來減少讀取量;用 scan Filter 來精煉傳回的內容。

單一表格設計:複合鍵

單一表格設計會用一個鍵前綴把多種實體類型塞進同一個表格 — USER#123ORDER#456TENANT#acme。DynoTable 會自行辨識這些前綴, 不需要任何設定:

  • 鍵會就地解碼。 一個複合值 — 一個大寫前綴,以 #|~ 與其餘部分相連 — 會在每個格線中以其加上標籤的各部分呈現: 表格、PartiQL 結果與 Workbench。僅僅是包含其中一個字元的一般值 (像 #FF5733 這樣的十六進位顏色、以管線分隔的清單) 則會原封不動地保留。
  • 一鍵 Filter 到某個實體。 右鍵點按一列並選擇 Filter to USER# — 該前綴會直接從那一列的鍵讀取。DynoTable 會對該鍵套用 一個真正的 begins_with,作為一個一般的 Filter 藥丸,你可以用平常的 方式(它的 Clear)清除它。當某一列的 partition sort 鍵 都帶有前綴時,每一個鍵你都會得到一個選項。

沒有對話框、沒有設定,也沒有任何儲存的內容 — 它完全是從你眼前的鍵 即時推導出來的。

在一個多載表格上的右鍵列選單 — 篩選 USER# 與 篩選 POST# 切面,位於解碼成加上標籤片段的鍵上方。
在一個多載表格上的右鍵列選單 — 篩選 USER#篩選 POST# 切面,位於解碼成加上標籤片段的鍵上方。

排序與分頁

sort key 藥丸帶有一個排序方向切換(遞增/遞減), 對應到 DynamoDB 的 ScanIndexForward。結果會一次一頁地串流 — Load more 會擷取下一頁,而變更頁面大小 則會從第一頁重新載入。

Run to end

預設情況下,query 或 scan 會在讀取幾頁後暫停,好讓大型表格不會 一次全部載入 — 動作按鈕會顯示 Load more 以擷取下一頁。 當你寧願一口氣拉出全部內容時,請切換執行模式:

  • 點按動作按鈕旁的 chevron 並選擇 Run to end。主按鈕會改名為 Scan all / Query all / Run all — 包括你暫停在頁面預算上時, 此時點按它就會一路讀到底。
  • 點按那個改名後的按鈕,DynoTable 就會持續擷取頁面,直到整個表格 (或 Index)讀取完畢。這個選擇會在該工作階段內逐分頁記住; 選擇 Paged 即可切換回去。挑選某個模式本身絕不會啟動一次執行 — 它只會為按鈕改名,因此何時觸發由你決定。

大型表格上,第一次裝填 Run to end 時會先顯示一個確認提示, 附上表格的概略大小與項目數量,讓一次完整 scan 永遠是經過深思的選擇, 而非一場意外。確認以繼續,或取消以維持分頁狀態。

執行模式分割按鈕 — chevron 選單含 Paged 與 Run to end,旁邊是 Load more 按鈕。
執行模式分割按鈕 — chevron 選單含 Paged 與 Run to end,旁邊是 Load more 按鈕。

從鍵盤操作:

  • ⌘↩ 會執行目前的查詢 — 而當結果暫停在頁面預算上時, 它會繼續到下一頁,而非重頭開始。
  • ⌘⇧↩ 一律一口氣讀到底
  • ⌘.Esc 可隨時停止進行中的執行。

已更新