在DynamoDB表中插入一个条目,其中包含两个条件

时间:2017-12-01 04:45:38

标签: amazon-web-services amazon-dynamodb

条件:

  1. (hashKey,rangekey)组合不应该已经存在于表中

  2. 新插入的范围键值必须比最大范围键多一个。

  3. 我尝试使用此处指定的expectedValueAttribute: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ExpectedAttributeValue.html

    但我一次只能提出一个条件。如何执行这两个条件?

    Map<String, ExpectedAttributeValue> expectedAttributes = ...
        .put(hashKey, new ExpectedAttributeValue(false))
        .put(rangeKey, new ExpectedAttributeValue(false))
        .build();
    

    这仅满足上述条件1.

1 个答案:

答案 0 :(得分:0)

由于在没有首先查询现有范围密钥的情况下无法比较现有范围密钥的最大值,因此需要分两步完成。

1)获取具有给定分区键的最高范围键的项目

2)将返回的范围键与您拥有的键进行比较,如果返回的键恰好少一个,则放置新项。 (请注意,您实际上并不需要检查项目是否已存在 - 因为查询已经确认它不存在)。

DynamoDB以给定分区的范围键顺序存储您的项目,并且还将按此顺序返回给定分区的项目。如果您的范围键是数字,则排序顺序是数字,您希望分区的最后结果不是第一个。您可以使用ScanIndexForward尊重查询的顺序,然后获取第一项。

查询将是:

Table table = dynamoDB.getTable("YOUR_TABLE");

QuerySpec spec = new QuerySpec()
    .withKeyConditionExpression("hash = :v_hash")
    .withValueMap(new ValueMap()
        .withString(":v_hash", "your_hash")
    .withScanIndexForward(false)
    .setMaxResultSize(1);

ItemCollection<QueryOutcome> items = table.query(spec);

如果项目范围键比新项目范围键小1,则放置该项目。请注意,如果项目列表为空(即分区键尚不存在),则应考虑该行为。