免費工具

DynamoDB 查詢建構器

組合整個 Query 或 Scan 請求 — 表格、Index、鍵條件、Filter、投影、Limit、排序方向、一致性讀取與分頁 — 並複製可執行的 AWS SDK v3、CLI 或 boto3 程式,或 PartiQL 陳述式。

組合你的請求
請求選項
可執行的程式碼
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb";

const client = new DynamoDBClient({});

const params = {
  "TableName": "Orders",
  "KeyConditionExpression": "#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)",
  "ExpressionAttributeNames": {
    "#hashKey": "pk",
    "#rangeKey": "sk"
  },
  "ExpressionAttributeValues": {
    ":hashKeyValue": {
      "S": "USER#123"
    },
    ":rangeKeyValue": {
      "S": "ORDER#"
    }
  },
  "Limit": 25
};

const items = [];
let lastEvaluatedKey;
do {
  const page = await client.send(
    new QueryCommand({ ...params, ExclusiveStartKey: lastEvaluatedKey })
  );
  items.push(...(page.Items ?? []));
  lastEvaluatedKey = page.LastEvaluatedKey;
} while (lastEvaluatedKey);

console.log(items);

從存取模式到可執行的請求

表達式很少是全部的工作。正式環境的 Query 還要決定讀取哪個 Index、每次請求評估多少項目、sort key 朝哪個方向掃描、讀取是否必須強一致,以及回應帶著 LastEvaluatedKey 回來時該怎麼辦。這些請求層級參數存在於表達式字串之外 — 而複製貼上的程式碼片段通常就在這裡出錯。

這個建構器把請求當作工作單位。你在與我們的表達式建構器相同、具型別且對保留字安全的模型上組合鍵條件、Filter 與投影,並在旁邊設定請求選項。輸出不是片段,而是可以執行的程式 — import、用戶端初始化、呼叫本身,以及在啟用「取得所有頁面」時,把每一頁結果都讀完的 ExclusiveStartKey 迴圈。

產生的程式碼對每個目標都保持誠實。AWS CLI 會自行分頁,所以它的 Limit 變成 --page-size,單次請求執行則加上 --no-paginate;PartiQL 婉拒屬於 ExecuteStatement API 而非陳述式本身的參數;遞減的 Query 在可表達時會變成對 sort key 的 ORDER BY。

只需要表達式本身 — 六種操作中任一種的條件、Filter 或更新表達式及其佔位符對應表? DynamoDB 表達式建構器正是為此而打造。 還在兩種讀取操作之間做決定? Query 與 Scan 的比較 拆解了各自適用的時機。

常見問題

這與 DynamoDB 表達式建構器有什麼不同?

兩者刻意分工。表達式建構器的主題是表達式語法 — 涵蓋全部六種操作的鍵條件、Filter、更新與條件表達式,以及它們的 ExpressionAttributeNames/Values 對應表 — 並且只輸出指令本身。查詢建構器的主題是完整的 Query 或 Scan 請求:表格與 Index、鍵條件、Filter、投影,再加上表達式工具沒有提供的請求層級參數(Limit、排序方向、ConsistentRead、ExclusiveStartKey),並輸出一個含用戶端初始化與可選分頁迴圈的可執行程式。

在 Query 或 Scan 中,Limit 究竟限制什麼?

Limit 限制的是 DynamoDB 每次請求評估的項目數,而不是你拿回的符合項目數。Filter 在讀取之後才執行,所以帶著 Limit 25 與 FilterExpression 的 Query 可能回傳不到 25 個項目 — 甚至一個也沒有 — 卻仍消耗其評估內容的全部讀取容量,分頁則從 LastEvaluatedKey 繼續。在會自動分頁的 AWS CLI 中,同一個參數以 --page-size 設定。

DynamoDB 分頁(LastEvaluatedKey)如何運作?

仍有更多資料的 Query 或 Scan 回應會包含 LastEvaluatedKey — 也就是最後讀取項目的主鍵。你在下一次請求中將它作為 ExclusiveStartKey 傳回,反覆進行直到收到不含它的回應。開啟「取得所有頁面」後,產生的 SDK v3 與 boto3 程式正包含這個迴圈;除非你傳入 --no-paginate,AWS CLI 會自行逐頁讀取。

什麼時候可以使用強一致讀取?

ConsistentRead 適用於基礎表格與 local secondary index,但不適用於 global secondary index — 對 GSI 發出且設定了 ConsistentRead 的 Query 會被拒絕。強一致讀取消耗的讀取容量也是最終一致讀取的兩倍。它是 API 參數,而非 PartiQL 陳述式文字的一部分,這也是 PartiQL 分頁誠實婉拒它的原因。

我在這裡輸入的內容會被上傳到任何地方嗎?

不會。這是靜態頁面:請求的組合與程式碼的產生完全在你的瀏覽器中完成,表格名稱、鍵值與 Filter 永遠不會到達伺服器。「複製連結」會把整個請求打包進 URL — 分享那個連結是你輸入的內容離開頁面的唯一途徑,而這由你決定。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。