簡體   English   中英

在 nodejs 中非分區鍵和排序鍵列上使用 GSI 和過濾器表達式進行 Dynamodb 查詢

[英]Dynamodb query with GSI and filter expression on non partition key and sort key columns in nodejs

我的桌子上有一個 GSI,我正在使用該 GSI 查詢結果。 我也在使用過濾器表達式

const active_cases = await storesMonthlyAudit();
console.info("actives cases : ", active_cases)

async function storesMonthlyAudit() {
    const params = {
        TableName: "jms-case-management-dev",
        IndexName: "entity-sKey-index",
        ProjectionExpression: "storeId,caseId",
        KeyConditionExpression: "#entity = :entity",
        FilterExpression: "#status = :status",
        ExpressionAttributeNames: {
            "#entity": "entity",
            "#status": "status",
        },
        ExpressionAttributeValues: {
            ":entity": "Case",
            ":status": "Active"
        }
    };
    const cases = await Query(params);
    return cases
}

回復:

actives cases :  {
  Items: [],
  Count: 0,
  ScannedCount: 8012,
  LastEvaluatedKey: { entity: 'Case', sKey: 'C#10134066', pKey: 'ST#1013' }
}

但是當我從 AWS 控制台嘗試同樣的事情時,我得到了 2 條狀態為“活動”的記錄的正確結果

在此處輸入圖像描述

DynamoDB 只會為每個查詢請求訪問 1MB 的數據。 此數據訪問在任何過濾器或投影表達式之前進行計數。 您指定的分區鍵下似乎存儲了超過 1 MB 的數據。 您需要發出多個請求才能訪問所有數據。

控制台使用響應中的LastEvaluatedKey進行其他查詢。 您可以看到它在運行查詢時消耗了 559 個 RCU,這意味着它總共發出了 5 次請求讓您找到這兩個值。

您同樣需要進行多次查詢。 為此,您可以在后續請求中設置ExclusiveStartKey ,將此值設置為上一個請求的LastEvaluatedKey 當請求未返回LastEvaluatedKey時,您就知道您已經搜索了與您的查詢匹配的所有項目。

我閱讀了 LastEvaluatedKey 和 ExclusiveStartKey 並寫了一個小的 function

async function dbRead(params) {
  let result = await db.query(params).promise();
  let data = result.Items;
  if (result.LastEvaluatedKey) {
    params.ExclusiveStartKey = result.LastEvaluatedKey;
    data = data.concat(await dbRead(params));
  }
  return data;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM