在DynamoDB中使用排序键时,“索引键类型不匹配”

时间:2016-05-09 15:35:54

标签: java amazon-dynamodb

我有一个包含以下索引的表:

  • 用户
    • id(string,primary)
    • 电子邮件(字符串,全球二级)
    • expiresOn(日期(字符串),全局次要)
    • is_premium(boolean)

我希望is_premiumexpiresOn的范围/排序键,因此我可以查询所有在今天或之前到期的帐号,并且其中is_premium = true。

如果我刚查询所有在今天/之前到期的帐户,但没有is_premium = true,我会得到结果中90%的表格。

但是,如果我尝试在is_premium上设置范围查询,当我尝试将记录保存到表中时会出现以下错误:

  

com.amazonaws.AmazonServiceException:索引键的类型不匹配   (服务:null;状态代码:400;错误代码:ValidationException;   请求ID:null)

     

在   com.amazonaws.services.dynamodbv2.local.embedded.DDBExceptionMappingInvocationHandler.handleDynamoDBLocalServiceException(DDBExceptionMappingInvocationHandler.java:76)     在   com.amazonaws.services.dynamodbv2.local.embedded.DDBExceptionMappingInvocationHandler.invoke(DDBExceptionMappingInvocationHandler.java:58)     在com.sun.proxy。$ Proxy70.putItem(未知来源)at   com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper $ SaveObjectHandler.doPutItem(DynamoDBMapper.java:1270)     在   com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper $ 1.executeLowLevelRequest(DynamoDBMapper.java:879)     在   com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper $ SaveObjectHandler.execute(DynamoDBMapper.java:1120)     在   com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:966)     在   com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:758)

我在dynamoDbMapper.save(order)

上得到了这个

如果我删除sort / range键,一切正常。

任何想法我做错了什么?这个错误非常荒谬。

2 个答案:

答案 0 :(得分:2)

dynamodb中的散列/范围键不支持布尔字段。 (仅支持字符串/数字/二进制)。

您需要将其转换为STRING或NUMBER(或添加新列)。 (如果这是您的范围键,那么它可以是' true' false'或0/1)。如果它是你的哈希键,那么它可能会更复杂。

答案 1 :(得分:1)

布尔值在DynamoDB中没有有效的散列/范围键。使您建议的架构工作的可能解决方案是修改数据映射器以在0和1上映射布尔值。

但是这样您只能查询特定的到期日期,然后检查相应的用户是否是高级用户。如果我正确理解了您的用例,那么您想要的是在is_premium =true个时间范围内的所有expiresOn。在这种情况下,最好的架构是:

  • is_premium作为全局辅助分区键
  • expiresOn作为全局二级排序键

这样您就可以查询is_premium分区并使用排序键来例如过滤掉该分区中一天内到期的所有项目。