如何使用 DynamoDBMapper Java 在 DynamoDB 中包含函数?

Ho to use contains function in DynamoDB with DynamoDBMapper Java?

我需要用 contains 函数检查数据列表是 DynamoDB。以下是我的 Java 代码,

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

我将上面的列表插入到名为 Data.JSON 的 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 内。那么我在这里做错了什么?有谁能够帮助我?提前致谢。

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

来自docs-

A filter expression is applied after a Query finishes, but before the results are returned. Therefore, a Query consumes the same amount of read capacity, regardless of whether a filter expression is present.

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

来自docs-

An attribute of type String Set. For example:
"SS": ["Giraffe", "Hippo" ,"Zebra"]
Type: Array of strings

所以,这里从 new AttributeValue().withS 更改为 new AttributeValue().withSS 以应用于列表。请注意,您仍然需要将对象降低到 DDB 可以理解的 AttributeValue 粒度。

这个 doc 有更高级的样本。