1

我需要检查具有contains功能的数据列表是 DynamoDB。以下是我的Java代码,

List<String> dataList = new ArrayList<>();

我将上面的列表插入到名为 Data 的 JSON 中。

Map<String, AttributeValue> valueMap = new HashMap<>();
valueMap.put(":v", new AttributeValue().withS(String.valueOf(dataList)));

Map<String, String> nameMap = new HashMap<>();
nameMap.put("#list", "Data.list");

DynamoDBQueryExpression<> queryExpression = new DynamoDBQueryExpression<>()
                .withFilterExpression("contains(#list, :v)")
                .withExpressionAttributeNames(nameMap)
                .withExpressionAttributeValues(valueMap)
                .withConsistentRead(false);

我使用了上述方法,但它不起作用。我需要的是,如果任何列表值包含在 dynamo db 插入的列表值中,我需要过滤数据。列表数据在 Json 中。那么我在这里做错了什么?有谁能够帮助我?提前致谢。

4

1 回答 1

2
  1. 您的查询没有withKeyConditionExpression作为 building的一部分DynamoDBQueryExpression
  2. FilterExpression没有改善您的 RCU 消耗。它增加的价值很少。我更喜欢使用干净的查询对象 ( ddbMapper.query(Object)) 并过滤获得响应的帖子。

文档-

在 Query 完成之后,但在返回结果之前应用过滤器表达式。因此,无论是否存在过滤器表达式,一个 Query 都会消耗相同数量的读取容量。

注意: 如果仍然希望在 DynamoDB 查询中执行此操作,则需要确保AttributeValue提供的类型正确。

文档-

字符串集类型的属性。例如:
"SS": ["Giraffe", "Hippo" ,"Zebra"]
类型:字符串数组

所以,这里从new AttributeValue().withStonew AttributeValue().withSS改为 apply over list。请注意,您仍然需要将对象降低到AttributeValueDDB 可以理解的粒度。

文档有更高级的示例。

于 2021-01-26T16:58:10.650 回答