(DynamoDB Collection) Collection查询需要sortKey吗?

(DynamoDB Collection) Is sortKey required for Collection query?

我正在制作一些 lambda 以从 dynamoDB 获取数据 table。

DynamoDB table 有

如果我没理解错的话,
我可以使用 setId 来查询,因为 DynamoDb 通过分区键进行收集。
所以我尝试了这个参数。

const params = {
        TableName: MY_TABLE_NAME,
        KeyConditionExpression: `#setId = :setId AND #type = :type `,
        ExpressionAttributeNames: { "#setId": "setId", "#type": "type" },
        ExpressionAttributeValues: {
            ":setId": { S: "set_1" },
            ":type": { S: "type A" },
        },
    }

但是returns错误

ValidationException: Query condition missed key schema element: id

Q.

提前致谢!



仅供参考)我也尝试使用 GSI 并且下面的工作如我预期的那样..

const params = {
        TableName: MY_TABLE_NAME,
        IndexName: "blahblah",
        KeyConditionExpression: `#type = :type`,
        FilterExpression: `#setId = :setId`,
        ExpressionAttributeNames: { "#setId": "setId", "#type": "type" },
        ExpressionAttributeValues: {
            ":setId": { S: "set_1" },
            ":type": { S: "type A" },
        },
    }

您向我们展示了请求 参数,但没有显示您在执行哪个请求。 DynamoDB 有两个与您的情况相关的不同读取请求 - GetItemQuery:

  • 第一个GetItem只能获取单个项目,单个项目由其完整主键指定(在您的情况下,setId 和 id ).您不能使用 GetItem 并且只能指定部分主键。如果这样做,您会看到与您看到的类似的错误。
  • 第二种请求,Query,可能是您想要使用的请求。它可以为您提供所有具有相同分区键 (setId) 的项目,这些项目按排序键 (id) 排序 - 您不需要在查询中指定特定的排序键。请阅读如何使用 Query 的文档,并注意结果是分页的(理论上一个查询可能 return 数百万个项目,并且不能在单个页面中执行此操作)。

您请求中的另一个问题(也许这就是您看到的问题?)是您试图在 KeyConditionExpression 中使用 #type = :type。你不能 - 正如其名称所示,关键条件仅适用于主键 - 而类型不是(除非你正在查询 GSI)。你应该把这个条件放在FilterExpression,而不是KeyConditionExpression.