[英]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.