2016-05-09 31 views
1

私はいくつかのレコードとの日付からなるテーブルを持っています(エポックからミリ秒単位で格納され、Nタイプ)。日付でDynamoDbを照会またはスキャンできない

今日の日付より前に作成されたすべてのレコードを照会できるようにしたいと思いますが、それに多くの問題があります。

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)列を文字列としてマップする必要があります。2)日付をUTC文字列としてフォーマットする必要があります。まだ動作していないクエリを使用してhttp://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.QueryScanExample.html

、そしておそらくこれは、全表スキャンが必要になります:

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); 

から撮影:次のコードは動作しています。スーパーカウンタは直感的ですが、少なくとも今は機能します。

関連する問題