我有一个包含以下索引的表:
我希望is_premium
为expiresOn
的范围/排序键,因此我可以查询所有在今天或之前到期的帐号,并且其中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键,一切正常。
任何想法我做错了什么?这个错误非常荒谬。
答案 0 :(得分:2)
dynamodb中的散列/范围键不支持布尔字段。 (仅支持字符串/数字/二进制)。
您需要将其转换为STRING或NUMBER(或添加新列)。 (如果这是您的范围键,那么它可以是' true' false'或0/1)。如果它是你的哈希键,那么它可能会更复杂。
答案 1 :(得分:1)
布尔值在DynamoDB中没有有效的散列/范围键。使您建议的架构工作的可能解决方案是修改数据映射器以在0和1上映射布尔值。
但是这样您只能查询特定的到期日期,然后检查相应的用户是否是高级用户。如果我正确理解了您的用例,那么您想要的是在is_premium =true
个时间范围内的所有expiresOn
。在这种情况下,最好的架构是:
is_premium
作为全局辅助分区键expiresOn
作为全局二级排序键这样您就可以查询is_premium
分区并使用排序键来例如过滤掉该分区中一天内到期的所有项目。