使用 GSI 的 dynamodb 查询和非分区键上的过滤器表达式和 nodejs 中的排序键列
dynamodb query with GSI and filter expression on non partition key and sort key columns in nodejs
我的 table 上有一个 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 并编写了一个小函数
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;
}
我的 table 上有一个 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 并编写了一个小函数
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;
}