我有一个由一些记录组成的表,以及一个created_on
列,它是一个日期(存储为自纪元以来的毫秒,具有N
类型)。
我希望能够查询在今天的日期之前创建的所有记录,但我遇到了很多问题。
我尝试在created_on
上添加全局二级索引,然后尝试使用表达式created_on <= :v1
进行查询。但是这会产生错误com.amazonaws.AmazonServiceException: Query key condition not supported
一些谷歌搜索让我相信我需要使用扫描而不是查询,使用过滤器表达式。所以我现在正在尝试:
Map<String, AttributeValue> args = //build map with key ':v1' and value of date's timestamp here
DynamoDBScanExpression q = new DynamoDBScanExpression()
.withIndexName('created_on-index')
.withFilterExpression("created_on > :v1")
.withExpressionAttributeValues(args);
return mapper.scan(type, q);
运行时没有错误,但返回0条记录。我已经确认它返回的毫秒数是今天的日期,并且表中有3条条件应该与条件匹配。
有什么想法吗?
答案 0 :(得分:1)
看来1)列需要映射为字符串,2)日期需要格式化为UTC字符串。以下代码正在运行:
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));;
AttributeValue mapped = new AttributeValue();
mapped = mapped.withS( dateFormatter.format( (Date) dateVal ) );
Map<String, AttributeValue> args = Collections.singletonMap(":v1", mapped);
DynamoDBScanExpression q = new DynamoDBScanExpression()
.withIndexName('created_on-index')
.withFilterExpression("created_on <= :v1")
.withExpressionAttributeValues(args);
取自:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.QueryScanExample.html
使用查询仍然无法正常工作,可能需要进行全表扫描。超级计数器直观,但至少它现在有效。