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

问题描述

我需要使用 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 中。那么我在这里做错了什么?有谁能够帮我?提前致谢。

解决方法

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

来自docs -

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

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

来自docs -

字符串集类型的属性。例如:
"SS": ["长颈鹿"、"河马"、"斑马"]
类型:字符串数组

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

doc 包含更高级的示例。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...