DynamoDBでscanを実行してみる

DynamoDBのテーブル名が SampleTable, AttributeがIdとNameのみのテーブルに対してScanを実行した。

AWS SDK for Javaで以下のように実行してみた。

import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.dynamodb.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodb.model.AttributeValue;
import com.amazonaws.services.dynamodb.model.ComparisonOperator;
import com.amazonaws.services.dynamodb.model.Condition;
import com.amazonaws.services.dynamodb.model.GetItemRequest;
import com.amazonaws.services.dynamodb.model.GetItemResult;
import com.amazonaws.services.dynamodb.model.Key;
import com.amazonaws.services.dynamodb.model.PutItemRequest;
import com.amazonaws.services.dynamodb.model.PutItemResult;
import com.amazonaws.services.dynamodb.model.ScanRequest;
import com.amazonaws.services.dynamodb.model.ScanResult;


public class DynamoDBLoadGenerator {

	static AmazonDynamoDBClient dynamoDB;
	
	public static void main(String[] args) throws IOException {
		//Credentialsの設定
		AWSCredentials credentials = new PropertiesCredentials(
                DynamoDBSample.class.getResourceAsStream("AwsCredentials.properties"));

		//リクエストのパラメータの設定
                dynamoDB = new AmazonDynamoDBClient(credentials);
                dynamoDB.setEndpoint("http://dynamodb.ap-northeast-1.amazonaws.com");
                String tableName = "SampleTable";
        
         

                //ScanFilterConditionの設定
                Condition scanFilterCondition = new Condition()
    	               .withComparisonOperator(ComparisonOperator.LT.toString())   //〇〇よりも小さい
    	               .withAttributeValueList(new AttributeValue().withN("500")); //500
        
                Map<String, Condition> conditions = new HashMap<String, Condition>();
                conditions.put("Id", scanFilterCondition);
        
    	        ScanRequest scanRequest = new ScanRequest()
    		       .withTableName(tableName)
    		       .withScanFilter(conditions)
    		       .withAttributesToGet(Arrays.asList("Id")); //Idに対してScanFilterを実行

    	       //Scan実行
    	       ScanResult scanResult = dynamoDB.scan(scanRequest);
    
               //結果表示
               for (Map<String, AttributeValue> item : scanResult.getItems()){
        	     System.out.println(item.get("Id"));
               }
	}
}

実行結果は以下のように出力される。

{N: 251, }
{N: 187, }
{N: 154, }
{N: 7, }
{N: 115, }
{N: 286, }
{N: 361, }
{N: 380, }
{N: 117, }
{N: 401, }
{N: 47, }
{N: 184, }
{N: 403, }
{N: 304, }
{N: 156, }
{N: 122, }
{N: 273, }
以下省略

IDが500以下のデータが出力された。
また今回使用したScanFilterConditionでComparisonOperatorで、BETWEENやBEGIN WITHやCONTAINなどいろいろ指定できる。今回使ったのはLT(おそらくはLess Thanのことだと思う)。これでscanするフィルターをいろいろ設定できそう。

試しにNameが"Book 500"とイコールであるIdをFilterConditionで指定したのが以下。

        //ScanFilterConditionの設定
        Condition scanFilterCondition = new Condition()
    	.withComparisonOperator(ComparisonOperator.EQ.toString())
    	.withAttributeValueList(new AttributeValue().withS("Book 500"));


以下はComparisonOperatorのJavaDoc
[http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodb/model/ComparisonOperator.html:title=
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodb/model/ComparisonOperator.html]