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

标签 javascript node.js amazon-web-services amazon-dynamodb

我想查询没有主分区键的 dynamo db 表
主排序键

那些在我的 table 上

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 人阅读过它,所以我认为是时候为 future 的读者提供答案了——而不仅仅是评论。
DynamoDB 有两个不同的操作:ScanQuery . Scan扫描整个表,而 Query可以有效地缩小一个特定的 分区键 (它仍然可以返回大量项目,因为可能有大量具有相同分区键的项目)。
因为您没有要扫描的特定分区键(jobid 是您的排序键,而不是您的分区键),所以您需要使用 Scan操作并读取整个表。
这也意味着该操作将非常昂贵:A Scan读取数据库中的每一项并收取费用。即使你通过了 FilterExpression并消除大部分不感兴趣的项目,DynamoDB 仍会读取每个项目并对其进行过滤 - 因此会向您收费。
此扫描成本高昂的原因之一是 Scan操作支持KeyConditionExpression Query 的选项在某些情况下,这可能会降低此扫描的成本:您的查询涉及在每个分区中查找特定的排序键 (jobid = :jobid)。如果每个分区都相当长,DynamoDB 可以查找 jobid = :jobid在每个分区中而不读取整个分区 - 并且不向您收取读取整个分区的费用。
最后,一般建议:在 DynamoDB 上设计应用程序的关键是首先考虑您拥有的查询类型,然后设计数据布局以使这些查询高效。在您的情况下,数据模型似乎不适合这种类型的查询 - 所以如果它们很常见,您可能应该重新考虑您的数据布局。例如制作jobid分区键,或为 jobid 添加 GSI ,或其他更改,具体取决于您的数据实际拥有的内容以及您需要对其执行的其他查询。

关于javascript - 如何在没有主键或排序键的情况下查询 dynamo db?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53078108/

相关文章:

amazon-web-services - 具有Cognito的AWS Elasticsearch Kibana-缺少角色

javascript 填充 iframe,修改源码合二为一

javascript - PHP函数不显示 "&"之后的字符串

javascript - 对 JavaScript 中的对象集合中的列求和

javascript - 调整 Google Sheets API Node.js 快速入门以使用我自己的工作表,错误 : Error: Unable to parse range: Class Data! A2:E

javascript - For 循环在循环内部和外部具有不同的值

node.js - Angular 和 Nodejs : Sending image

facebook - Heroku Node.js facebook 设置问题

amazon-s3 - 文件夹不会在 Amazon S3 上删除

amazon-web-services - 无法在 AWS 中使用 RDS 创建弹性 Beanstalk 环境