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

2022-08-30 09:06:01

我有一个名为“具有主键的产品”的表。我想选择表格中的所有项目。这是我使用的代码: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),
                ),
            )
        )
    )   
));

是否可以在不指定主键的情况下选择所有项目?我正在使用适用于 PHP 的 AWS 开发工具包。


答案 1

Amazon DynamoDB 为此提供了扫描操作,该操作通过对表执行完全扫描来返回一个或多个项目及其属性。请注意以下两个约束:

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

    注意:
    如果扫描的项目总数超过 1MB 的限制,扫描将停止,结果将返回给用户与上次评估的密钥,以在后续操作中继续扫描。结果还包括超出限制的项目数。扫描可能导致没有表数据符合筛选条件。

    结果集最终是一致的。

  • 扫描操作在性能和消耗的容量单位 (即价格) 方面都可能付出高昂的代价,请参阅 Amazon DynamoDB 中查询和扫描中的扫描和查询性能部分:

    [...]此外,随着表的增长,扫描操作会变慢。扫描操作会检查每个项目是否具有请求的值,并且可能会在单个操作中用尽大型表的预配吞吐量。为了加快响应时间,请改用 Query、Get 或 BatchGetItem API 来设计表。或者,将应用程序设计为以最小化对表的请求速率的影响的方式使用扫描操作。有关更多信息,请参阅 Amazon DynamoDB 中的预置吞吐量指南[强调我的]

您可以在使用适用于 Amazon DynamoDB 的适用于 PHP 的 AWS 开发工具包低级 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>";
}

答案 2

嗨,您可以使用boto3下载。在 python 中

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'])


推荐