我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。
QueryRequest query = new QueryRequest()
.withTableName(TABLE_NAME)
.withKeyConditionExpression("testId = :" + "1234567890");
QueryResult result = client.query(query);
这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措辞的任何问题]
仅供参考:这是我在尝试使用上述代码时得到的错误声明:
errorMessage": "Invalid KeyConditionExpression: An expression attribute value used in expression is not defined
您应该真正更新以使用AWS SDK For Java V2(我不知道为什么那么多开发人员使用AWS SDK For V1-这不是最佳实践)。使用AWS SDK for Java v2是使用Amazon DynamoDB API的最佳实践。
要了解有关AWS V2JavaAPI的更多信息,请阅读此处的开发人员指南。
开发者指南-AWS SDK for Java 2。x个
现在我将用V2回答这个问题。要通过复合键(分区键和排序键)成功获取项目,您可以使用属于software.amazon.awssdk.services.dynamodb.DynamoDbClient服务客户端的getItem()。这是一个代码示例。
public static void getItem(DynamoDbClient ddb) {
HashMap<String,AttributeValue> keyToGet = new HashMap<>();
keyToGet.put("year", AttributeValue.builder()
.n("1933")
.build());
keyToGet.put("title", AttributeValue.builder()
.s("King Kong")
.build());
GetItemRequest request = GetItemRequest.builder()
.key(keyToGet)
.tableName("Movies")
.build();
try {
Map<String,AttributeValue> returnedItem = ddb.getItem(request).item();
if (returnedItem != null) {
Set<String> keys = returnedItem.keySet();
System.out.println("Amazon DynamoDB table attributes: \n");
for (String key1 : keys) {
System.out.format("%s: %s\n", key1, returnedItem.get(key1).toString());
}
} else {
System.out.format("No item found with the key %s!\n", "year");
}
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
System.exit(1);
}
}
要查看此示例的完整示例——包括其他相关操作,请参阅Github中的此示例:
https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/dynamodb/src/main/java/com/example/dynamodb/Scenario.java
这个完整的代码示例向您展示了如何执行各种Amazon DynamoDB操作。
更新
对我有效的解决方案是创建一个名为year index的二级索引。这只使用名为year的分区键。我可以使用此索引成功地进行查询,如这里使用AWS管理控制台所示。
现在只归还2014年的电影。这就是当您的表有一个由分区键和排序键组成的复合键,并且您只想查询分区键时的查询方式。
顺便说一下,你说你有一个二级索引。一个表可以有多个二级索引
我有一个用JPA和Spring Data DynamoDB建立的Spring项目。它工作正常。我可以通过分区键和排序键(称为DynamoDBHashKey和DynamoDBRangeKey)读取DynamoDB表中的项。 我的问题是,我的存储库的设置方式是使用查询和扫描操作来读取表,而不是使用获取项目操作,这应该会更高效。 这是我的实体: 这是我的存储库: 当我的表同时具有分区键和排序键时,如何配
我是DynamoDB的新手,想知道我们如何通过在JAVA中使用ONLY分区键来查询DynamoDB中的表 我有一个名为“ervive pdi data invalid qa”的表,其模式是: 分区键为SubmissionId 排序键是id。 城市(属性) 错误(属性) 这张桌子看起来像这样:桌子 我想通过使用(software.amazon.awssdk)新版本的AWS SDK DynamoDB类
我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分
我有一个带有分区键(UUID)的DynamoDB表,其中有几个属性(如名称、电子邮件、创建日期等)。创建日期是项目中的一个属性,其格式为YYYY-MM-DD。但现在有一个要求更改-我必须根据创建日期对其进行排序,并提供整个数据(也就是说,我不能只将数据放在某个特定分区上,而是以排序方式将所有分区中的所有数据都放在一起。我知道这可能需要DynamoDB花费时间从所有分区中提取数据并在之后进行排序。我
假设我有一个名为“student_course”的Dynamo DB表。我想存储每个学生在大学学习的课程。一个学生可以一次学习多个课程,一个课程可以一次有多个学生。所以基本上它是一个多映射。 我的数据访问模式只有一个用例- 一次获取一个学生和一门课程的记录,即获取每个学生ID和CourseId组合的数据。它保证对于学生ID和课程ID组合,只有一条记录可用。 为了实现这一点,我可以通过以下两种方式存
与主键、复合键和候选键相比,dynamodb中的分区键和排序键是什么?