我想查询没有主分区键的 Dynamo 数据库表 主排序键
那些在我的桌子上
Primary partition key userid (String)
Primary sort key jobcodeid (String)
该表还包含一个关键的 jobid。
所以我想进行一个如下所示的查询。
var opts = {
'ConsistentRead': true,
TableName : 'interviews',
KeyConditionExpression: "jobid = :jobid",
ExpressionAttributeValues: { ":jobid": {"S":jobid} },
}
我正在使用此代码
dynamodb.query(opts, function(err, data) {
if(err){
//somthing
}else{
//Somthing
}
}
但是上面的查询返回这样的错误。
ValidationException: Query condition missed key schema element
我怎样才能执行这个查询?
这是一个非常受欢迎的问题,有超过 5000 人读过它,所以我认为是时候为未来的读者提供一个答案了 - 而不仅仅是评论。
DynamoDB 有两种不同的操作:Scan 和 Query。
Scan
扫描整个表,而Query
可以有效地缩小某个特定的分区键的范围(它仍然可以返回大量项目,因为可能存在大量具有相同分区键的项目). 因为您没有要扫描的特定分区键(
jobid
是您的排序键,而不是分区键),所以您需要使用
Scan
操作并读取整个表。这也意味着该操作将非常昂贵:A
Scan
会读取数据库中的每一项,并向您收取读取费用。即使您通过了
FilterExpression
并删除了大部分不感兴趣的项目,DynamoDB 仍会读取每一项并对其进行过滤 - 因此会向您收取费用。此扫描成本高昂的原因之一是
Scan
操作不 支持
KeyConditionExpression
具有的
Query
选项,在某些情况下,该选项可能会降低此扫描的成本:查询涉及在每个分区中查找特定的排序键(
jobid = :jobid
)。如果每个分区都相当长,DynamoDB 可以在每个分区中查找
jobid = :jobid
,而不读取整个分区 - 并且不会向您收取读取整个分区的费用。最后,一条一般建议:在 DynamoDB 上设计应用程序的关键是首先考虑您拥有的查询类型,然后设计数据布局以使这些查询高效。在您的情况下,数据模型似乎不适合此类查询 - 因此如果它们很常见,您可能应该重新考虑您的数据布局。例如,将
jobid
设为分区键,或为
jobid
添加 GSI,或根据您的数据实际拥有的内容以及需要对其执行的其他查询进行其他更改。