我正在尝试实现给定DynamoDB和数据库中已知的表名的函数,该函数确定该表是否为空。
我希望签名在Java中看起来如下所示:
public Boolean isEmpty(DynamoDB database, String tableName) = ???
出于此问题的目的,假设表具有一个主键,该主键由一个称为“ UserId”的整数类型属性组成。
我知道可以使用扫描来查看表,但是我(a)不知道表达式的外观,并且(b)需要将其限制为单个项目,因此如果它是非空的,我们不必扫描整个表(可能很大)。
编辑:
是否应该在构造函数中使用AmazonDynamoDB
而不是DynamoDB
?前者有一个scan
方法,它采用了ScanRequest
-您可以使用.limit(1)
轻松地设置限制-而后者,我会做类似database.getTable(tableName).scan(...)
的操作,但是这次扫描需要ScanSpec
,我不清楚如何为此设置限制。
答案 0 :(得分:0)
我不知道如何用Java来做,但是它必须类似于Javascript:
const params = {
TableName: tableName,
Limit: 1, // `Limit` is the most important parameter.
// The scan will not scan the whole table,
// it will only visit one item and then return.
// Very efficient!
};
// Execute the scan, whatever the syntax is...
const result = await (new AWS.DynamoDB.DocumentClient().scan(params).promise());
// Check the response
if (result.Count > 0) return false; // the table is **not** empty
return true; // the table is empty
在Java中,代码应该相似...请随时询问不够清晰的细节。
答案 1 :(得分:0)
在回答我自己的问题时,我发现了以下内容: Difference between AmazonDynamoDBClient and DynamoDB classes in their java SDK?
我尝试使用的DynamoDB
只是AmazonDynamoDB
的包装,提供了稍微不同的API。相反,使用AmazonDynamoDB
使该功能的实现更加容易,它看起来应该像这样(请原谅不好的Java代码,我实际上是在Scala中编写的):
public Boolean isEmpty(AmazonDynamoDB database, String tableName) = {
ScanRequest scanRequest = new ScanRequest().withTableName(tableName).withLimit(1);
return database.scan(scanRequest).getCount == 0;
}
或者,在Scala中:
def isEmpty(database: AmazonDynamoDB, tableName: String): Boolean = {
val scanRequest = new ScanRequest().withTableName(tableName).withLimit(1)
database.scan(scanRequest).getCount == 0
}