DynamoDB-如何检查现有表为空或非空

时间:2018-11-01 16:37:01

标签: java scala amazon-dynamodb aws-sdk

我正在尝试实现给定DynamoDB和数据库中已知的表名的函数,该函数确定该表是否为空。

我希望签名在Java中看起来如下所示:

public Boolean isEmpty(DynamoDB database, String tableName) = ???

出于此问题的目的,假设表具有一个主键,该主键由一个称为“ UserId”的整数类型属性组成。

我知道可以使用扫描来查看表,但是我(a)不知道表达式的外观,并且(b)需要将其限制为单个项目,因此如果它是非空的,我们不必扫描整个表(可能很大)。

编辑:

是否应该在构造函数中使用AmazonDynamoDB而不是DynamoDB?前者有一个scan方法,它采用了ScanRequest-您可以使用.limit(1)轻松地设置限制-而后者,我会做类似database.getTable(tableName).scan(...)的操作,但是这次扫描需要ScanSpec,我不清楚如何为此设置限制。

2 个答案:

答案 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
}