查询条件错过了关键模式元素:验证错误

Suh*_*pta 23 amazon-web-services nosql node.js amazon-dynamodb

我试图dynamodb使用以下代码进行查询:

const AWS = require('aws-sdk');

let dynamo = new AWS.DynamoDB.DocumentClient({
  service: new AWS.DynamoDB(
    {
      apiVersion: "2012-08-10",
      region: "us-east-1"
    }),
  convertEmptyValues: true
});

dynamo.query({
  TableName: "Jobs",
  KeyConditionExpression: 'sstatus = :st',
  ExpressionAttributeValues: {
    ':st': 'processing'
  }
}, (err, resp) => {
  console.log(err, resp);
});
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到一个错误说:

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

我不明白.我已将其定义idjobs表的分区键,需要查找processing状态为的所有作业.

smc*_*art 31

您正在尝试使用不包含主键的条件运行查询.这就是查询在DynamoDB中的工作方式.您需要对您的案例中的信息进行扫描,但是,我认为这不是最佳选择.

我想你想设置一个全局二级索引并使用它来查询processing状态.

  • 那个聊天很有帮助:-) (3认同)
  • 您能否在这里讨论这个问题:https://chat.stackoverflow.com/rooms/160644/migrated-from-https-stackoverflow-com-questions-47681108-query-condition-missed (2认同)
  • 根据定义,查询与键查找不是已经针对 GSI 了吗?我在 GSI 上运行查询操作时遇到此错误... (2认同)

Ula*_*Ula 6

@smcstewart在另一个答案中回答了这个问题。但是他提供了一个链接,而不是评论为什么会发生此错误。我想添加一个简短的评论,希望可以节省您的时间。

有关查询表的AWS文档指出,您可以以DynamoDB的方式进行WHERE条件查询(例如SQL query SELECT * FROM Music WHERE Artist='No One You Know'),但有一个重要警告:

您必须为PARTITION键指定一个EQUALITY条件,并且可以选择为SORT键提供另一个条件。

表示您只能将关键属性与一起使用Query。以任何其他方式执行此操作将意味着DynamoDB将为您运行完整扫描,但效率不高 -比使用全局二级索引效率低。

因此,如果您需要使用Query来查询非关键属性,通常不是一个选项-最佳选择是使用@smcstewart建议的全局二级索引

我发现该指南对于手动创建全局二级索引很有用。

如果您需要使用CloudFormation添加它,则这里是一个相关页面