是否可以通过嵌套列表属性扫描DynamoDB?

时间:2017-10-02 15:07:38

标签: java amazon-dynamodb

我的DynamoDB中有像这样的对象:

{
  'id': '2d47218a-9a9b-45a6-acbc-152bc49e93ad'
  'people': [
    {
      'name': 'John',
      'surname': 'Snow'
    },
    {
      'name': 'John',
      'surname': 'Smith'
    },
    {
      'name': 'James',
      'surname': 'Bond'
    },
  ]
}

我应该使用什么过滤器表达式来查找至少有一个人姓名为John的所有对象?

我尝试了类似的东西,但它不起作用:

DynamoDBScanExpression expression = new DynamoDBScanExpression()
                .withFilterExpression("people.name = :name")
                .withExpressionAttributeValues(
                        ImmutableMap.of(":name", new AttributeValue().withS("John")
                .withConsistentRead(true);
        DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(amazonDynamoDB);

        PaginatedScanList<Person> scan = dynamoDBMapper.scan(Person.class, expression);

1 个答案:

答案 0 :(得分:1)

不幸的是,这在DynamoDB上是不可能的,因为该对象具有复杂的结构(即DynamoDB在List中的术语Map)。

您需要namesurname属性值才能使用 CONTAINS 功能过滤项目。

如果您只有name属性值,则无法过滤该项目。

  

列表支持CONTAINS:评估&#34; a CONTAINS b&#34;,&#34; a&#34;   可以是一个清单;然而,&#34; b&#34;不能是集合,地图或列表。