2016-10-05 6 views
0

私はDynamoDbテーブルを持っています。それは "ID"のハッシュキーと "カテゴリ"の範囲キーを持っています。Java:Mapperを使用して範囲キーのすべての値をDynamoDBテーブルに問い合わせ

"カテゴリ"、コメディなどのすべてのエントリを検索しようとしています。

これは私のマッピングクラスである:

@DynamoDBTable(tableName = "Videos") 
public class VideoDynamoMappingAdapter { 

    private String videoID; 
    private String videoCategory; 
    private String videoArtist; 
    private String videoTitle; 

    @DynamoDBHashKey(attributeName = "ID") 
    public String getVideoID() { 
     return videoID; 
    } 

    public void setVideoID(String videoID) { 
     this.videoID = videoID; 
    } 
    @DynamoDBRangeKey(attributeName = "Category") 
    public String getVideoCategory() { 
     return videoCategory; 
    } 

    public void setVideoCategory(String videoCategory) { 
     this.videoCategory = videoCategory; 
    } 

    @DynamoDBAttribute(attributeName = "ArtistName") 
    public String getVideoArtist() { 
     return videoArtist; 
    } 

    public void setVideoArtist(String videoArtist) { 
     this.videoArtist = videoArtist; 
    } 

    @DynamoDBAttribute(attributeName = "VideoTitle") 
    public String getVideoTitle() { 
     return videoTitle; 
    } 

    public void setVideoTitle(String videoTitle) { 
     this.videoTitle = videoTitle; 
    } 

} 

私はこのような何かを照会しようとしている:

DynamoDBQueryExpression<VideoDynamoMappingAdapter> queryExpression = new DynamoDBQueryExpression<VideoDynamoMappingAdapter>() 
      .withRangeKeyCondition() 


    List<VideoDynamoMappingAdapter> itemList = mapper.query(VideoDynamoMappingAdapter.class, queryExpression); 

私はガイドを見ているされていますが、私はそれを理解することはできません、私は

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryingJavaDocumentAPI.html#DocumentAPIJavaQueryExample

:これは私は何かが欠けていますので、多分すべての時間を行われている簡単なクエリだろうと思っているだろう

あらかじめご協力いただきありがとうございます

答えて

1

Notionquestは、私は与えられた範囲の条件でのハッシュキーのすべての値を照会できなかった彼の答えで正しかったです。私はCategory属性にグローバルなセカンダリインデックスを作成することでこれを解決しました。

これは私のマッパークラスである:

@ DynamoDBTable(tableName = "AlarmTable") 
public class VideoDynamoMappingAdapter { 

    private String videoID; 
    private String videoCategory; 
    private String videoArtist; 
    private String videoTitle; 

    @DynamoDBHashKey(attributeName = "ID") 
    public String getVideoID() { 
     return videoID; 
    } 

    public void setVideoID(String videoID) { 
     this.videoID = videoID; 
    } 

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "CategoryIndex", attributeName = "Category") 
    public String getVideoCategory() { 
     return videoCategory; 
    } 

    public void setVideoCategory(String videoCategory) { 
     this.videoCategory = videoCategory; 
    } 

    @DynamoDBAttribute(attributeName = "VideoArtist") 
    public String getVideoArtist() { 
     return videoArtist; 
    } 

    public void setVideoArtist(String videoArtist) { 
     this.videoArtist = videoArtist; 
    } 

    @DynamoDBAttribute(attributeName = "VideoTitle") 
    public String getVideoTitle() { 
     return videoTitle; 
    } 

    public void setVideoTitle(String videoTitle) { 
     this.videoTitle = videoTitle; 
    } 

} 

は、そのためのカテゴリに注釈を注目してください。

そして、私のクエリは、このようなものです:

VideoDynamoMappingAdapter videosToFind = new VideoDynamoMappingAdapter(); 
     videosToFind.setVideoCategory("Other"); 

     DynamoDBQueryExpression<VideoDynamoMappingAdapter> queryExpression = new DynamoDBQueryExpression<VideoDynamoMappingAdapter>() 
       .withIndexName("CategoryIndex") 
       .withHashKeyValues(videosToFind) 
       .withConsistentRead(false); 

     List<VideoDynamoMappingAdapter> itemList = mapper.query(VideoDynamoMappingAdapter.class, queryExpression); 
     System.out.println("test" + itemList.size()); 

私はそれが誰かに役立ちます願っています。

2

DynamoDBテーブルは、範囲キーだけではハッシュキーを使用せずに照会することはできません。ただし、Rangeキーを使用しないでハッシュキーだけで照会することもできます。

ハッシュキーを使用せずにRangeキーだけでDynamoDBテーブルをクエリすると、ValidationExceptionがスローされます。

Unable to read item. Error JSON: { 
    "message": "Query condition missed key schema element", 
    "code": "ValidationException" 
} 

別のオプションは、スキャン RANGEキーを使用してデータベースになります。 DynamoDBスキャンは、テーブル全体をスキャンするため、コストがかかる操作であることに注意してください。カテゴリ別動画テーブルをスキャン

: -

「OR」条件はは、特定のデータ型のみでサポートされてい「IN」として使用されていることに注意してください。

public List<VideoDynamoMappingAdapter> getVidoesByCategory(String[] categories) { 

     ScanResultPage<VideoDynamoMappingAdapter> videoResultPage = null; 
     List<VideoDynamoMappingAdapter> videoList = new ArrayList<>(); 

     try { 

      do { 
       DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient); 

       Map<String, AttributeValue> expressionAttributeValues = new LinkedHashMap<String, AttributeValue>(); 

       StringBuilder filterExpression = new StringBuilder(); 
       int i = 1; 

       for (String category : categories) { 
        if (i==1) { 
         filterExpression.append("Category = " + ":videoCategory" + i); 
        } else { 
         filterExpression.append(" OR Category = " + ":videoCategory" + i); 
        } 

        expressionAttributeValues.put(":videoCategory" + i, new AttributeValue().withS(category)); 
        i++; 
       } 

       System.out.println("Filterexpression =====>" + filterExpression.toString()); 

       DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()     
         .withFilterExpression(filterExpression.toString()) 
         .withExpressionAttributeValues(expressionAttributeValues); 

       if (videoResultPage != null) { 
        scanExpression.setExclusiveStartKey(videoResultPage.getLastEvaluatedKey()); 
       } 

       videoResultPage = dynamoDBMapper.scanPage(VideoDynamoMappingAdapter.class, scanExpression); 

       System.out.println("Results ==========>" + videoResultPage.getResults()); 

       videoList.addAll(videoResultPage.getResults()); 

      } while (videoResultPage.getLastEvaluatedKey() != null); 

     } catch (Exception db) { 

      db.printStackTrace(); 

     } 

     System.out.println(videoList.toString()); 
     return videoList; 

    } 
+0

ご回答ありがとうございます。範囲内のすべてのハッシュを照会する方法を教えてください。 –

+1

スキャンコードを追加しました。私の以前の答えで述べたように、ハッシュキーがなければクエリはできません。 – notionquest

+0

ありがとうございます。それは私の理解がドキュメントのために間違っていたことを私に示した。私は毎回のスキャンが良い選択だとは思わないので、グローバルなセカンダリインデックスを追加するように変更して、それをクエリします。 –

関連する問題