DynamoDB查询无排序键

4

我有一个 DynamoDB 表,包含主键:userID,排序键:sessionID 和另一个名为 examID 的列。

我想返回一个列表,其中包含所有具有我发送的 userID 和 examID 的记录。以下是我的代码:

export const main = handler(async (event, context) => {

  const data = JSON.parse(event.body);
  const params = {
    TableName: process.env.tableNameExamResults,
    KeyConditionExpression: "userId = :userId and examId = :examId",
    ExpressionAttributeValues: {
      ":userId": event.requestContext.identity.cognitoIdentityId,
      ":examId": data.examId

    }
  };

  const result = await dynamoDb.query(params);

  
  return result.Items;
});



这是我得到的错误: { "statusCode": 500, "body":"{"error":"查询条件缺少关键模式元素:sessionId"}", ... }
我认为也许应该包含一个过滤表达式,或者不确定是否需要使用索引重新创建数据库。
任何帮助都将感激。谢谢。

我考虑基于userId进行查询,获取所有sessionId,然后使用FilterExpression按examID进行过滤。不确定如何准确实现这一点。文档对我来说有些不清楚... https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#query-property - Etika49
1个回答

1
我刚刚添加了一个新的GSI,然后也编辑了我的代码:
const params = {
    TableName: process.env.tableNameExamResults,
    IndexName: 'userId-examId-index', 
    KeyConditionExpression: "userId = :userId and examId = :examId",
    ExpressionAttributeValues: {
      ":userId": event.requestContext.identity.cognitoIdentityId,
      ":examId": data.examId

    }
  };

这似乎现在可以工作。


1
创建新索引将会创建一张新表,因此增加了更多成本。 如果每个用户只有少量的examIds,我建议使用投影方式获取数据。 - Mr Nobody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接