如何在没有主键或排序键的情况下查询 dynamo db?

Aru*_* VM 5 javascript amazon-web-services node.js amazon-dynamodb

我想查询没有主分区键主排序键的 dynamo 数据库表

这些在我的桌子上

Primary partition key   userid (String)
Primary sort key    jobcodeid (String)
Run Code Online (Sandbox Code Playgroud)

该表还包含一个关键的 jobid。

所以我想进行一个如下所示的查询。

  var opts  = {
          'ConsistentRead': true,
          TableName : 'interviews',
          KeyConditionExpression: "jobid = :jobid",
          ExpressionAttributeValues: { ":jobid": {"S":jobid} },
        }
Run Code Online (Sandbox Code Playgroud)

我正在使用这个代码

  dynamodb.query(opts, function(err, data) {
  if(err){
   //somthing
   }else{
   //Somthing
   }
 }
Run Code Online (Sandbox Code Playgroud)

但上面的查询返回这样的错误。

ValidationException: Query condition missed key schema element
Run Code Online (Sandbox Code Playgroud)

我怎样才能执行这个查询?

Nad*_*'El 1

这是一个非常受欢迎的问题,已有超过 5000 人阅读过,所以我认为现在是时候为未来的读者提供一个答案了,而不仅仅是评论。

DynamoDB 有两种不同的操作:ScanQueryScan扫描整个表,而Query可以有效地缩小某个特定分区键的范围(它仍然可以返回大量项目,因为可能存在大量具有相同分区键的项目)。

由于您没有要扫描的特定分区键(jobid是排序键,而不是分区键),因此您需要使用该Scan操作并读取整个表。

这也意味着该操作将非常昂贵:A 会Scan读取数据库中的每一项,并向您收取读取费用。即使您通过 aFilterExpression并删除大部分不感兴趣的项目,DynamoDB 仍会读取每一项并对其进行过滤 - 从而向您收取费用。

此扫描成本高昂的原因之一是该Scan操作支持KeyConditionExpressiona 具有的选项,在某些情况下,该选项可能会降低此扫描的成本:您的查询涉及在每个中Query查找特定的排序键( )jobid = :jobid分割。如果每个分区都相当长,DynamoDB 可以在每个分区中查找jobid = :jobid而不读取整个分区 - 并且不会因读取整个分区而向您收费。

最后,一条一般性建议:在 DynamoDB 上设计应用程序的关键是首先考虑您拥有的查询类型,然后设计数据布局以使这些查询高效。在您的情况下,数据模型似乎不适合此类查询 - 因此如果它们很常见,您可能应该重新考虑您的数据布局。例如,创建jobid分区键,或添加 GSI jobid,或根据您的数据实际拥有的内容以及您需要对其执行的其他查询进行其他更改。