使用 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;
}