如何在不指定主键的情况下从DynamoDB表中获取所有项目?

War*_*ior 34 php amazon-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),
                ),
            )
        )
    )   
));
Run Code Online (Sandbox Code Playgroud)

是否可以在不指定主键的情况下选择所有项目?我正在使用AWS SDK for PHP.

Ste*_*pel 50

Amazon DynamoDB为此提供了扫描操作,该操作通过执行表的完整扫描返回一个或多个项及其属性.请注意以下两个限制:

  • 根据您的表大小,您可能需要使用分页来检索整个结果集:

    注意
    如果扫描项目的总数超过1MB限制,扫描将停止,并使用LastEvaluatedKey将结果返回给用户,以便在后续操作中继续扫描.结果还包括超出限制的项目数.扫描可能导致没有符合过滤条件的表数据.

    结果集最终是一致的.

  • 对于性能和消耗容量单位(即价格),扫描操作的成本可能很高,请参阅Amazon DynamoDB中的查询和扫描中的扫描和查询性能一节:

    [...]此外,随着表的增长,扫描操作变慢.扫描操作检查所请求值的每个项目,并且可以在单个操作中耗尽大型表的预配置吞吐量.为了缩短响应时间,请以可以使用Query,Get或BatchGetItem API的方式设计表.或者,将应用程序设计为使用扫描操作,以最大限度地减少对表的请求率的影响.有关更多信息,请参阅Amazon DynamoDB中的预配置吞吐量指南.[强调我的]

您可以使用适用于Amazon DynamoDB的AWS SDK for PHP低级API扫描表中找到有关此操作的更多详细信息以及一些示例摘录,其中最简单的示例说明了操作:

$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>";
}
Run Code Online (Sandbox Code Playgroud)


小智 14

您好,您可以使用 boto3 下载。在蟒蛇中

import boto3
from boto3.dynamodb.conditions import Key, Attr

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Table')
response = table.scan()
items = response['Items']
while 'LastEvaluatedKey' in response:
    print(response['LastEvaluatedKey'])
    response = table.scan(ExclusiveStartKey=response['LastEvaluatedKey'])
    items.extend(response['Items'])

Run Code Online (Sandbox Code Playgroud)

  • @Ronnie 是的,是这样。然而,OP 希望从表中提取所有行。查询的成本同样昂贵。 (2认同)

Ste*_*ign 6

我认为您正在使用 PHP,但未提及(已编辑)。我通过搜索互联网发现了这个问题,因为我得到了解决方案,对于那些使用 nodejs 的人来说,这里是一个使用 scan 的简单解决方案:

  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));
    }
  });
Run Code Online (Sandbox Code Playgroud)

我假设使用不同的 AWS SDK可以将相同的代码转换为 PHP