Amazon dynamodb 带有全局二级索引的DynamoDB查询抛出';ValidationException:不支持查询键条件';

Amazon dynamodb 带有全局二级索引的DynamoDB查询抛出';ValidationException:不支持查询键条件';,amazon-dynamodb,aws-appsync,aws-cdk,dynamodb-queries,amazon-dynamodb-index,Amazon Dynamodb,Aws Appsync,Aws Cdk,Dynamodb Queries,Amazon Dynamodb Index,当尝试从AWS中的AppSync控制台执行查询时,会不断出现以下错误,如CloudWatch的日志所示:“ValidationException:不支持查询键条件” 我尝试过用不同的类型和全局二级索引更改模式,在这里我交换了分区键和排序键。将代码改为扫描而不是查询也可以 我使用AWS-CDK设置了一个GraphQL API。对于DynamoDB表,我想使用一个全局二级索引。为此,我在我的模式中进行了设置。graphql: type ObjectName { id: ID! trackTi

当尝试从AWS中的AppSync控制台执行查询时,会不断出现以下错误,如CloudWatch的日志所示:“ValidationException:不支持查询键条件”

我尝试过用不同的类型和全局二级索引更改模式,在这里我交换了分区键和排序键。将代码改为扫描而不是查询也可以

我使用AWS-CDK设置了一个GraphQL API。对于DynamoDB表,我想使用一个全局二级索引。为此,我在我的
模式中进行了设置。graphql

type ObjectName {
  id: ID!
  trackTimeStampUtc: Int!
  channel: String!
  ...
}
与:

频道(字符串!)
作为分区键

trackTimeStampUtc(Int!)
作为排序键

Stack.ts中也是如此:

const table = new ddb.Table(this, 'tableName', {
  billingMode: ddb.BillingMode.PAY_PER_REQUEST,
  timeToLiveAttribute: 'ttl',
  partitionKey: {
    name: 'id',
    type: ddb.AttributeType.STRING,
  },
});

table.addGlobalSecondaryIndex({
  indexName: 'search-index',
  partitionKey: {
    name: 'channel',
    type: ddb.AttributeType.STRING,
  },
  sortKey: {
    name: 'trackTimeStampUtc',
    type: ddb.AttributeType.NUMBER,
  },
});
在使用参数的函数的Lambda处理程序中:

params:  {
  Index: 'search-index',
  TableName: 'tableName',
  KeyConditionExpression: '#ch = :channel and #ts between :start and :end',
  ExpressionAttributeNames: { 
    '#ch': 'channel', 
    '#ts': 'trackTimeStampUtc' 
  },
  ExpressionAttributeValues: { 
    ':channel': 'test', 
    ':start': 1610971398, 
    ':end': 1611667818 
  }
}
使用
wait docClient.query(params.promise()发送

虽然我确信我做错了什么,但我似乎无法理解。使用
.scan
进行设置并稍作调整,效果很好,但使用GSI会更好。请问有人能帮忙吗

更新27-01 11:52:

我意识到分区键和排序键的组合对于它所服务的目的来说可能不是最有效的,尽管我不会有任何其他的组合工作。所以,对我来说,让它发挥作用就是理解它应该如何发挥作用

更新29-01 15:18:


问题解决了。原来我在参数中有
索引
,用于引用索引名,而不是
索引名
。已更改,修复了问题,查询正常运行。再次感谢您,Peter。

您能确认您提供给
docClient的参数吗?query(…)
正在使用
IndexName
而不是
Index
来识别您正在查询的索引吗?噢,天哪,我确实一直在使用
Index
(如参数属性中所示),而不是
IndexName
。稍后将尝试并报告。很好,希望它能起作用。如果继续失败,请更新问题——我对AppSync不太了解,但这里的DynamoDB细节看起来很可靠。我成功地复制了上面的查询。因此,我刚刚将属性
Index
更改为
IndexName
,查询马上就可以工作了。在这种情况下,我是傻瓜,因为它的文档也很清楚。非常感谢@PeterWagener找到罪犯。非常欢迎!如果您更深入地研究使用DynamoDB,那么使用AWSSDK的TypeScript和V3有助于避免此类问题。此时,参数是复杂的对象,因此很容易遗漏某些内容。