(DynamoDB Collection) Collection查询需要sortKey吗?
(DynamoDB Collection) Is sortKey required for Collection query?
我正在制作一些 lambda 以从 dynamoDB 获取数据 table。
DynamoDB table 有
- 复合主键
- 'setId' as partition key (range key)(我用这个词'set'作为名词,就像这里的'group')
- 'id' 作为排序键(散列键)
- 'type' 作为 GSI
- 和其他属性('name' 等)
如果我没理解错的话,
我可以使用 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.
- 获取集合需要排序键吗?
- 或者我在参数中丢了什么东西吗?
- 或者我需要在 table 上设置额外的东西吗?
提前致谢!
仅供参考)我也尝试使用 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 有两个与您的情况相关的不同读取请求 - GetItem
和 Query
:
- 第一个
GetItem
只能获取单个项目,单个项目由其完整主键指定(在您的情况下,setId 和 id ).您不能使用 GetItem
并且只能指定部分主键。如果这样做,您会看到与您看到的类似的错误。
- 第二种请求,
Query
,可能是您想要使用的请求。它可以为您提供所有具有相同分区键 (setId) 的项目,这些项目按排序键 (id) 排序 - 您不需要在查询中指定特定的排序键。请阅读如何使用 Query
的文档,并注意结果是分页的(理论上一个查询可能 return 数百万个项目,并且不能在单个页面中执行此操作)。
您请求中的另一个问题(也许这就是您看到的问题?)是您试图在 KeyConditionExpression
中使用 #type = :type
。你不能 - 正如其名称所示,关键条件仅适用于主键 - 而类型不是(除非你正在查询 GSI)。你应该把这个条件放在FilterExpression
,而不是KeyConditionExpression
.
我正在制作一些 lambda 以从 dynamoDB 获取数据 table。
DynamoDB table 有
- 复合主键
- 'setId' as partition key (range key)(我用这个词'set'作为名词,就像这里的'group')
- 'id' 作为排序键(散列键)
- 'type' 作为 GSI
- 和其他属性('name' 等)
如果我没理解错的话,
我可以使用 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.
- 获取集合需要排序键吗?
- 或者我在参数中丢了什么东西吗?
- 或者我需要在 table 上设置额外的东西吗?
提前致谢!
仅供参考)我也尝试使用 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 有两个与您的情况相关的不同读取请求 - GetItem
和 Query
:
- 第一个
GetItem
只能获取单个项目,单个项目由其完整主键指定(在您的情况下,setId 和 id ).您不能使用GetItem
并且只能指定部分主键。如果这样做,您会看到与您看到的类似的错误。 - 第二种请求,
Query
,可能是您想要使用的请求。它可以为您提供所有具有相同分区键 (setId) 的项目,这些项目按排序键 (id) 排序 - 您不需要在查询中指定特定的排序键。请阅读如何使用Query
的文档,并注意结果是分页的(理论上一个查询可能 return 数百万个项目,并且不能在单个页面中执行此操作)。
您请求中的另一个问题(也许这就是您看到的问题?)是您试图在 KeyConditionExpression
中使用 #type = :type
。你不能 - 正如其名称所示,关键条件仅适用于主键 - 而类型不是(除非你正在查询 GSI)。你应该把这个条件放在FilterExpression
,而不是KeyConditionExpression
.