使用Java和DynamoDBMapper扫描DynamoDB JSON文档

时间:2015-04-23 11:35:28

标签: java amazon-dynamodb document-database

我正在使用DynamoDB并通过将JSON传递给它来存储文档,所有这些都使用Java中的DynamoDBMapper类。

将数据放入表中非常简单。如果您有可用的哈希值或范围值,也可以查询表。

但我想用JSON文档对值进行扫描(我推测)。我一直在寻找一些例子,但我找不到任何东西,或者至少在使用DynamoDBMapper的方式时找不到。

那么我认为可以做到这一点是正确的吗?如果是这样,有没有人有这样做的例子?具体来说,如何在文档/ JSON中指定要查询的属性?

我的表设置了哈希,范围和“文档”属性,其中包含传递给它的JSON。因此,如果我想检查该“文档”中的“名称”值,如何在条件中指定它?

以下是我尝试过的代码段示例:

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
    scanExpression
            .addFilterCondition(
                    "document.name",
                    new Condition().withComparisonOperator(
                            ComparisonOperator.EQ)
                            .withAttributeValueList(
                                    new AttributeValue()
                                            .withS(existingWebsiteName)));
    List<PublisherSite> scanResult = getMapper().scan(PublisherSite.class, scanExpression);

我也尝试将attributeName指定为“name”,但这也不起作用。我没有得到任何结果。

1 个答案:

答案 0 :(得分:1)

FilterConditions仅适用于顶级属性。您的代码段尝试将FilterCondition放在名为&#34; document.name&#34;的顶级属性上。相反,您可以使用FilterExpression来条件化嵌套属性上的项目检索,并且可以使用ProjectionExpression来选择所需的顶级和嵌套属性。

final String filterExpression = "document.name = :existingWebsiteName";
final Map<String, AttributeValue> expressionAttributeValues = Collections.singletonMap(":existingWebsiteName", existingWebsiteName);

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withFilterExpression("document.name = :existingWebsiteName")
    .withExpressionAttributeValues(expressionAttributeValues);
List<PublisherSite> scanResult = getMapper().scan(PublisherSite.class, scanExpression);