使用Java高级API从DynamoDB表获取所有表项

使用Java高级API从DynamoDB表获取所有表项,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,我使用dynamodbmapper在dynamodb表中实现了扫描操作,但没有得到所有结果。每当我运行程序时,扫描返回不同数量的项目 代码段: DyanmoDBScanExpression scanExpression = new DynamoDBScanExpression(); List<Books> scanResult = mapper.scan(Books.class, scanExpression); DyanmoDBScanExpression扫描表达式=新的Dyna

我使用dynamodbmapper在dynamodb表中实现了扫描操作,但没有得到所有结果。每当我运行程序时,扫描返回不同数量的项目

代码段:

DyanmoDBScanExpression scanExpression = new DynamoDBScanExpression();
List<Books> scanResult = mapper.scan(Books.class, scanExpression);
DyanmoDBScanExpression扫描表达式=新的DynamoDBScanExpression();
List scanResult=mapper.scan(Books.class,scanExpression);

我调查了一下,发现了扫描返回的项目的限制。但是我找不到一种方法来使用mapper从表中获取所有项目!有没有一种方法可以让我遍历表中的所有项目。我在JVM中设置了足够的堆内存,因此不会出现内存问题。

扫描应返回所有项目。
问题是返回的集合是延迟加载的。 您需要遍历列表,当它使用所有获取的项目时,将在后台进行额外调用以引入更多项目(直到所有项目都被引入)

在该示例中,它是:

List<Book> scanResult = mapper.scan(Book.class, scanExpression);

for (Book book : scanResult) {
    System.out.println(book);
}
List scanResult=mapper.scan(Book.class,scanExpression);
for(书籍:scanResult){
系统输出打印(图书);
}

您需要迭代,直到不再返回LastEvaluatedKey。在SDK中的一个官方示例中检查如何完成:

有点晚了,但是

import java.util.HashMap;
import java.util.Map;
import java.util.List;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;

public final class LogFetcher {

    static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
    static String tableName = "SystemLog";

    public static List<SystemLog> findLogsForDeviceWithMacID(String macID) {

        client.setRegion(Region.getRegion(Regions.EU_WEST_1));

        DynamoDBMapper mapper = new DynamoDBMapper(client);
        Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
        eav.put(":val1", new AttributeValue().withS(macID));

        DynamoDBQueryExpression<SystemLog> queryExpression = new DynamoDBQueryExpression<SystemLog>()
                .withKeyConditionExpression("parentKey = :val1")
                .withExpressionAttributeValues(eav);

         List<SystemLog> requestedLogs = mapper.query(SystemLog.class, queryExpression);

        return requestedLogs;
    }
}

在java中,使用不带任何过滤器的DynamoDBScanExpression,

// Change to your Table_Name (you can load dynamically from lambda env as well)
DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig.Builder().withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement("Table_Name")).build();

DynamoDBMapper mapper = new DynamoDBMapper(client, mapperConfig);

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();

// Change to your model class   
List < ParticipantReport > scanResult = mapper.scan(ParticipantReport.class, scanExpression);



// Check the count and iterate the list and perform as desired.
scanResult.size();
//更改表名(也可以从lambda env动态加载)
DynamoDBMapperConfig mapperConfig=新的DynamoDBMapperConfig.Builder()。带有TableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(“Table_Name”))。build();
DynamoDBMapper mapper=新的DynamoDBMapper(客户端,mapperConfig);
DynamoDBScanExpression scanExpression=新的DynamoDBScanExpression();
//换上你的模型课
ListscanResult=mapper.scan(ParticipantReport.class,scanExpression);
//检查计数并迭代列表,然后根据需要执行。
scanResult.size();
默认情况下,
DynamoDBMapper#scan
方法返回一个“惰性加载的”集合。信息技术 最初只返回一页结果,然后创建一个服务 如果需要的话,打电话到下一页。要获取所有匹配项, 迭代分页的结果集合

但是,PaginatedScanList提供了开箱即用的方法,有助于急切地加载此列表的所有结果

注意:
loadAllResults
方法仅在迭代模式下不受支持

List<Books> scanResult = mapper.scan(Books.class, new DynamoDBScanExpression());
scanResult.loadAllResults();//Eagerly loads all results for this list.
//Total results loaded into the list
System.out.println(scanResult.size());
List scanResult=mapper.scan(Books.class,new DynamoDBScanExpression());
scanResult.loadAllResults()//急切地加载此列表的所有结果。
//加载到列表中的总结果
System.out.println(scanResult.size());

您能否以编程方式告诉我如何实现该功能,或者为其提供参考文档?谢谢你的回答。它没有魔力。你只是在列表上进行交互,就像在任何列表上一样。这也是我之前所做的。但我没有拿到所有的东西。每次跑步,我都会得到不同数量的物品。这些物品的数量有何不同?它在增加吗?有很大的变化吗?在遍历列表时,您是否看到对dynamo的其他调用?它们并不总是增加,只是每次都不同。我如何检查对dynamodb的额外呼叫?我对dynamodb没有太多经验,我刚刚开始实现它。这是一个查询表达式,与扫描不同
List<Books> scanResult = mapper.scan(Books.class, new DynamoDBScanExpression());
scanResult.loadAllResults();//Eagerly loads all results for this list.
//Total results loaded into the list
System.out.println(scanResult.size());