Javascript 不带排序键的DynamoDB查询

Javascript 不带排序键的DynamoDB查询,javascript,amazon-web-services,amazon-dynamodb,dynamodb-queries,Javascript,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,我有一个DynamoDB表,其中包含主键:userID、排序键:sessionID和另一个名为examID的列 我想返回一个列表,该列表返回由我发送的具有userID和examID的所有记录。 这是我的密码: export const main = handler(async (event, context) => { const data = JSON.parse(event.body); const params = { TableName: process.env.

我有一个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;
});


这是我得到的错误: { “状态代码”:500, “body”:“{”error:“查询条件缺少关键架构元素:sessionId”}”

我想也许我应该包括一个过滤器表达式,或者不确定是否必须用索引重新创建数据库


非常感谢您的帮助。谢谢您

我刚刚添加了一个新的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

    }
  };

这似乎现在起作用了。

我考虑过基于用户ID进行查询,获取所有sessionId,然后通过examID使用FilterExpression进行过滤。不确定如何准确实现。Docu对我来说有点不清楚……创建新索引将创建一个新表,从而增加成本。如果每个用户都需要,我建议使用投影来提取数据很少有考试。