添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在上一篇 文章中, 我们使用底层Java api在DynamoDB数据库上发出了查询。

使用DynamoDBMapper进行查询非常简单。

使用哈希键发出查询非常简单。 这样的查询的最佳候选者是通过使用电子邮件哈希键进行搜索的Users表。

public User getUser(String email) {
        User user = dynamoDBMapper.load(User.class,email);
        return user;
 

由于我们仅对用户表使用哈希键,因此结果将被限制为1。

加载功能也可用于复合键。 因此,查询登录表项将需要哈希键和范围键。

public Login getLogin(String email,Long date) {
        Login login =  dynamoDBMapper.load(Login.class,email,date);
        return login;
 

下一步是使用条件发出更复杂的查询。 我们将发出一个查询,该查询将获取两个日期之间的登录尝试。

public List<Login> queryLoginsBetween(String email, Long from, Long to) {
        Map<String,String> expressionAttributesNames = new HashMap<>();
        expressionAttributesNames.put("#email","email");
        expressionAttributesNames.put("#timestamp","timestamp");
        Map<String,AttributeValue> expressionAttributeValues = new HashMap<>();
        expressionAttributeValues.put(":emailValue",new AttributeValue().withS(email));
        expressionAttributeValues.put(":from",new AttributeValue().withN(Long.toString(from)));
        expressionAttributeValues.put(":to",new AttributeValue().withN(Long.toString(to)));
        DynamoDBQueryExpression<Login> queryExpression = new DynamoDBQueryExpression<Login>()
                .withKeyConditionExpression("#email = :emailValue and #timestamp BETWEEN :from AND :to ")
                .withExpressionAttributeNames(expressionAttributesNames)
                .withExpressionAttributeValues(expressionAttributeValues);
        return dynamoDBMapper.query(Login.class,queryExpression);
 

我们使用DynamoDBQueryExpression,与在低级api中使用它的方式相同。
主要区别在于我们根本不需要处理分页。 DynamoDBMapper会将DynamoDB项映射到对象,但还将返回“延迟加载”集合。 它最初仅返回一页结果,然后在需要时对下一页进行服务调用。

最后但并非最不重要的是,对索引的查询是基本操作之一。 对于本地或全局二级索引,它是相同的例程。
请记住,获取的结果取决于创建表后指定的投影类型。 在我们的情况下,投影类型适用于所有字段。

public Supervisor getSupervisor(String company,String factory) {
        Map<String,String> expressionAttributesNames = new HashMap<>();
        expressionAttributesNames.put("#company","company");
        expressionAttributesNames.put("#factory","factory");
        Map<String,AttributeValue> expressionAttributeValues = new HashMap<>();
        expressionAttributeValues.put(":company",new AttributeValue().withS(company));
        expressionAttributeValues.put(":factory",new AttributeValue().withS(factory));
        DynamoDBQueryExpression<Supervisor> dynamoDBQueryExpression = new DynamoDBQueryExpression<Supervisor>()
                .withIndexName("FactoryIndex")
                .withKeyConditionExpression("#company = :company and #factory = :factory ")
                .withExpressionAttributeNames(expressionAttributesNames)
                .withExpressionAttributeValues(expressionAttributeValues)
                .withConsistentRead(false);
        List<Supervisor> supervisor = dynamoDBMapper.query(Supervisor.class,dynamoDBQueryExpression);
        if(supervisor.size()>0) {
            return supervisor.get(0);
        } else {
            return null;
 

要特别注意一致读取设置为false的事实。 DynamoDBQueryExpression使用默认的一致读取。 使用全局二级索引时,无法发出一致的读取。

您可以在github上找到带有单元测试的完整源代码。

翻译自: https://www.javacodegeeks.com/2016/10/__trashed.html

与 AWS SDK v2 和 v3 兼容 import { DynamoDB } from '@aws-sdk/client-dynamodb' ; import { DynamoDBDocument } from '@aws-sdk/lib-dynamodb' ; import { getPaginatedResult , decodeCursor } from 'dynamodb-paginator' ; interface User { id : string name : string const documentClient = DynamoDBDocument . from ( new DynamoDB ( { } ) ) ; const limit = 25 ; const standardQueryPar Amazon DynamoDB是一项完全托管的NoSQL数据库服务,可提供无缝的可扩展性和快速可预测的性能。 Amazon DynamoDB自动将表的数据和流量分布在足够数量的服务器上,以处理客户指定的请求容量和存储的数据量,同时保持一致且快速的性能。 所有数据项都存储在固态磁盘(SSD)上,并自动跨区域中的多个可用区复制,以提供内置的高可用性和数据持久性。 您可以通过A... 问题The bounty expires in 6 days. Answers to this question are eligible for a +50 reputation bounty.T Anna wants to draw more attention to this question.I have a DynamoDb table named school-data in AWS.... BatchGetItem A single operation can retrieve up to 16 MB of data, which can contain as many as 100 items. BatchGetItem will return a partial res... 以前,我们使用Java创建了DynamoDB表。 对于各种数据库(例如sql数据库或nosql),有一组工具可帮助访问,持久化和管理对象/类与基础数据库之间的数据。 例如,对于SQL数据库,我们使用JPA,对于Cassandra,我们使用MappingManager。 DynamoDBMapper是使您能够访问各种表中的数据,对项目执行各种CRUD操作以及对表执行查询和扫描的工具。 ... 之前,我们介绍了如何使用DynamoDBMapper或底层Java api查询DynamoDB数据库。 除了发出查询之外,DynamoDB还提供扫描功能。 扫描的目的是获取您在DynamoDB表上可能拥有的所有项目。 因此,扫描不需要任何基于我们的分区键或您的全局/本地二级索引的规则。 扫描提供的功能是基于已获取的项目进行过滤,并从已获取的项目中返回特定属性。 下面的代码段通过... 主表结构(offline-archive.201604) msgid(主分区键,字符串), msg(字符串), topic(字符串), ts(long型时间戳) GSI二级索引(topic-ts-index) 项目键(topic) 排序键(ts)