Подтвердить что ты не робот

Как я могу получить все элементы из таблицы DynamoDB без указания первичного ключа?

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

$batch_get_response = $dynamodb->batch_get_item(array(
    'RequestItems' => array(

        'products' => array(
            'Keys' => array(
                array( // Key #1
                    'HashKeyElement'  => array( AmazonDynamoDB::TYPE_NUMBER => '1'),
                    'RangeKeyElement' => array( AmazonDynamoDB::TYPE_NUMBER => $current_time),
                ),
                array( // Key #2
                    'HashKeyElement'  => array( AmazonDynamoDB::TYPE_NUMBER => '2'),
                    'RangeKeyElement' => array( AmazonDynamoDB::TYPE_NUMBER => $current_time),
                ),
            )
        )
    )   
));

Можно ли выбрать все элементы без указания первичного ключа? Я использую AWS SDK для PHP.

4b9b3361

Ответ 1

Amazon DynamoDB предоставляет Scan для эта цель, которая возвращает один или несколько элементов и их атрибуты, выполняя полное сканирование таблицы. Обратите внимание на следующие два ограничения:

  • В зависимости от размера таблицы вам может потребоваться использовать разбиение на страницы для получения всего набора результатов:

    Примечание
    Если общее количество отсканированных элементов превышает предел 1 МБ, сканирования, и результаты возвращаются пользователю с помощью LastEvaluatedKey для продолжения сканирования в последующей операции. результаты также включают количество предметов, превышающих лимит. Сканирование может привести к тому, что данные таблицы не будут соответствовать критериям фильтра.

    В конечном итоге результат будет согласован.

  • Операция сканирования потенциально дорогостоящая в отношении производительности и единиц потребляемой мощности (например, цена), см. раздел "Сканирование и производительность запроса" в Запрос и сканирование в Amazon DynamoDB:

    [...] Кроме того, по мере роста таблицы операция сканирования замедляется. Сканирование операция проверяет каждый элемент для запрошенных значений, а может использовать обеспеченная пропускная способность для большой таблицы за одну операцию. Для более быстрого реагирования создайте свои таблицы таким образом, чтобы они могли использовать API запросов, Get или BatchGetItem. Или, спроектируйте свой приложение для использования операций сканирования таким образом, чтобы минимизировать воздействие по скорости запроса в таблице. Для получения дополнительной информации см. Provisioned Руководство по пропускной способности в Amazon DynamoDB. [акцент мой]

Более подробную информацию об этой операции можно найти и некоторые примеры фрагментов в Сканирующие таблицы Использование AWS SDK для PHP-API низкого уровня для Amazon DynamoDB, с самым простым примером, иллюстрирующим операцию:

$dynamodb = new AmazonDynamoDB();

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
));

foreach ($scan_response->body->Items as $item)
{
    echo "<p><strong>Item Number:</strong>"
         . (string) $item->Id->{AmazonDynamoDB::TYPE_NUMBER};
    echo "<br><strong>Item Name: </strong>"
         . (string) $item->Title->{AmazonDynamoDB::TYPE_STRING} ."</p>";
}

Ответ 2

Я получаю все элементы из DynamodB с помощью следующего запроса. Работает нормально. я создаю эти функции в рамках Zend Framework и получаю доступ к этим функциям через проект.

        public function getQuerydata($tablename, $filterKey, $filterValue){
            return $this->getQuerydataWithOp($tablename, $filterKey, $filterValue, 'EQ');
        }

        public function getQuerydataWithOp($tablename, $filterKey, $filterValue, $compOperator){
        $result = $this->getClientdb()->query(array(
                'TableName'     => $tablename,
                'IndexName'     => $filterKey,
                'Select'        => 'ALL_ATTRIBUTES',
                'KeyConditions' => array(
                    $filterKey => array(
                        'AttributeValueList' => array(
                            array('S' => $filterValue)
                        ),
                'ComparisonOperator' => $compOperator
            )
            )
        ));
            return $result['Items'];
        }

       //Below i Access these functions and get data.
       $accountsimg = $this->getQuerydataWithPrimary('accounts', 'accountID',$msgdata[0]['accountID']['S']);

Ответ 3

Вот простой код nodejs, использующий сканирование:

  var dynamoClient = new AWS.DynamoDB.DocumentClient();
  var params = {
    TableName: config.dynamoClient.tableName, // give it your table name 
    Select: "ALL_ATTRIBUTES"
  };

  dynamoClient.scan(params, function(err, data) {
    if (err) {
       console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
    } else {
       console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
    }
  });