java - 无法按日期查询或扫描 DynamoDb

标签 java amazon-dynamodb

我有一个包含一些记录的表,还有一个 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 条条件应匹配的记录。

有什么想法吗?

最佳答案

看来 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

使用查询仍然不起作用,并且可能需要全表扫描。 super 反直觉,但至少现在可以用了。

关于java - 无法按日期查询或扫描 DynamoDb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37123319/

相关文章:

java - IBM Watson Natural Language Classifier 准确性测量

java - 如何动态调整 JFrame 的大小以包含具有不同内容大小的 JPanel?

java - 使用 Webclient - Webflux 将两个 api 响应合并为一个

amazon-web-services - 在 DynamoDB 中将一张表复制到另一张表

java - 当 HTML5 验证存在时,为什么在 Spring MVC 中使用 @Valid

java - Tomcat启动时出现白标错误

node.js - 使用 Node.js 的单独索引表从 dynamodb 表获取项目

java - 查询 DynamoDB

mysql - 多日期时间列索引的最佳数据库解决方案

amazon-dynamodb - DynamoDB 嵌套查询支持