DynamoDB - как проверить, что существующая таблица пуста или не пуста - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь реализовать функцию, которая с учетом DynamoDB и именем таблицы, которую я знаю, существует в базе данных, определяет, является ли эта таблица пустой или нет.

Я ожидаю, что подпись будет выглядеть в Java следующим образом:

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

Предположим, для целей этого вопроса, что таблица имеет первичный ключ, состоящий из одного атрибута типа Integer, называемого "UserId".

Я знаю, что можно использовать сканирование для просмотра таблицы, но я (а) не знаю, как будет выглядеть выражение, и (б) нужно, чтобы оно было ограничено одним элементом, поэтому что нам не нужно сканировать всю таблицу (которая может быть большой) в случае, если она не пуста.

EDIT:

Должен ли я использовать AmazonDynamoDB в своем конструкторе вместо DynamoDB? У первого есть метод scan, который принимает ScanRequest - для которого вы можете легко установить предел, используя .limit(1) - тогда как для второго я бы сделал что-то вроде database.getTable(tableName).scan(...), но это сканирование требует ScanSpec для что мне не понятно, как установить предел для.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

В ответ на свой вопрос я нашел следующее: Разница между классами AmazonDynamoDBClient и DynamoDB в их 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
}
0 голосов
/ 02 ноября 2018

Я не знаю, как это сделать на 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 код должен быть похожим ... не стесняйтесь спрашивать подробности, он недостаточно ясен.

...