问题描述
我需要使用 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 中。那么我在这里做错了什么?有谁能够帮我?提前致谢。
解决方法
- 您的查询没有将
withKeyConditionExpression
作为构建DynamoDBQueryExpression
的一部分。 -
FilterExpression
并未改善您的 RCU 消耗。它增加的价值很少。我更喜欢使用干净的查询对象 (ddbMapper.query(Object)
) 并过滤获取响应的帖子。
来自docs -
在查询完成后,但在返回结果之前应用过滤器表达式。因此,无论是否存在过滤器表达式,Query 都会消耗相同数量的读取容量。
注意:
如果仍然希望在 DynamoDB 查询中执行此操作,您需要确保提供的 AttributeValue
类型是正确的。
来自docs -
字符串集类型的属性。例如:
"SS": ["长颈鹿"、"河马"、"斑马"]
类型:字符串数组
因此,此处从 new AttributeValue().withS
更改为 new AttributeValue().withSS
以应用于列表。请注意,您仍然需要将对象降低到 DDB 能够理解的 AttributeValue
粒度。
此 doc 包含更高级的示例。