在不使用扫描的情况下验证DynamoDB中的属性?

时间:2015-03-14 05:32:13

标签: amazon-dynamodb

如果不在dynamodb中使用扫描,如何验证属性是否存在于表中?

在我的用例中,从客户端,客户请求与他们的Customer_id一起了解产品的价值。在服务器端,必须检查输入的customer_id是否已经存在于DynamoDB表中。如果没有,则必须进行新的输入。

如何在不对表使用SCAN操作的情况下实现此案例?

1 个答案:

答案 0 :(得分:1)

听起来你想在这张桌子上做一个条件PutItem:如果没有另一个项目具有相同的customer_id,则将该项目放入表格中。这很容易做到,因为customer_id是表的哈希键。来自PutItem documentation

  

注意

     

要防止新项目替换现有项目,请使用 ComparisonOperator 设置为NULL的条件置位操作   主键属性或属性。

以下是我使用Java SDK中的Dynamo DB文档API编写并针对DynamoDB Local运行的快速示例:

import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDB;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.document.DynamoDB;
import com.amazonaws.services.dynamodbv2.document.Expected;
import com.amazonaws.services.dynamodbv2.document.Item;
import com.amazonaws.services.dynamodbv2.document.Table;
import com.amazonaws.services.dynamodbv2.model.AttributeDefinition;
import com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException;
import com.amazonaws.services.dynamodbv2.model.CreateTableRequest;
import com.amazonaws.services.dynamodbv2.model.KeySchemaElement;
import com.amazonaws.services.dynamodbv2.model.KeyType;
import com.amazonaws.services.dynamodbv2.model.ProvisionedThroughput;
import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType;
import com.amazonaws.services.dynamodbv2.util.Tables;

public class StackOverflow {

    private static final String EXAMPLE_TABLE_NAME = "example_table";

    public static void main(String[] args) {
        AmazonDynamoDB client = new AmazonDynamoDBClient(new BasicAWSCredentials("accessKey", "secretKey"));
        client.setEndpoint("http://localhost:4000");
        DynamoDB dynamoDB = new DynamoDB(client);
        if (Tables.doesTableExist(client, "example_table")) client.deleteTable(EXAMPLE_TABLE_NAME);

        // Create table with hash key 'customer_id'
        CreateTableRequest createTableRequest = new CreateTableRequest();
        createTableRequest.withTableName(EXAMPLE_TABLE_NAME);
        createTableRequest.withKeySchema(new KeySchemaElement("customer_id", KeyType.HASH));
        createTableRequest.withAttributeDefinitions(new AttributeDefinition("customer_id", ScalarAttributeType.S));
        createTableRequest.withProvisionedThroughput(new ProvisionedThroughput(15l, 15l));
        dynamoDB.createTable(createTableRequest);
        Tables.waitForTableToBecomeActive(client, EXAMPLE_TABLE_NAME);

        Table exampleTable = dynamoDB.getTable(EXAMPLE_TABLE_NAME);

        exampleTable.putItem(new Item()
                .withPrimaryKey("customer_id", "ABCD")
                .withString("customer_name", "Jim")
                .withString("customer_email", "jim@gmail.com"));

        System.out.println("After Jim:");
        exampleTable.scan()
                    .forEach(System.out::println);
        System.out.println();

        try {
            exampleTable.putItem(new Item()
                    .withPrimaryKey("customer_id", "EFGH")
                    .withString("customer_name", "Garret")
                    .withString("customer_email", "garret@gmail.com"), new Expected("customer_id").notExist());
        } catch (ConditionalCheckFailedException e) {
            System.out.println("Conditional check failed!");
        }

        System.out.println("After Garret:");
        exampleTable.scan()
                    .forEach(System.out::println);
        System.out.println();

        try {
            exampleTable.putItem(new Item()
                    .withPrimaryKey("customer_id", "ABCD")
                    .withString("customer_name", "Bob")
                    .withString("customer_email", "bob@gmail.com"), new Expected("customer_id").notExist());
        } catch (ConditionalCheckFailedException e) {
            System.out.println("Conditional check failed!");
        }

        System.out.println("After Bob:");
        exampleTable.scan()
                    .forEach(System.out::println);
    }
}

输出:

After Jim:
{ Item: {customer_email=jim@gmail.com, customer_name=Jim, customer_id=ABCD} }

After Garret:
{ Item: {customer_email=garret@gmail.com, customer_name=Garret, customer_id=EFGH} }
{ Item: {customer_email=jim@gmail.com, customer_name=Jim, customer_id=ABCD} }

Conditional check failed!
After Bob:
{ Item: {customer_email=garret@gmail.com, customer_name=Garret, customer_id=EFGH} }
{ Item: {customer_email=jim@gmail.com, customer_name=Jim, customer_id=ABCD} }