63

我有一个名为 products with primary key 的表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 开发工具包。

4

7 回答 7

71

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

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

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

    结果集最终是一致的。

  • 就性能和消耗的容量单位(即价格)而言,扫描操作的成本可能很高,请参阅Query 和 Scan in Amazon DynamoDB中的扫描和查询性能部分:

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

您可以在Scanning Tables Using the AWS SDK for PHP Low-Level API for 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>";
}
于 2012-05-04T15:17:36.650 回答
17

您好,您可以使用 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'])

于 2020-01-24T13:25:16.893 回答
8

我认为您正在使用 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));
    }
  });

我假设相同的代码也可以使用不同的 AWS 开发工具包翻译成 PHP

于 2019-10-15T20:52:29.727 回答
2

我使用以下查询从 dynamodb 获取所有项目。它工作正常。我在 zend 框架中创建了这些通用函数,并通过项目访问这些函数。

        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']);
于 2015-06-05T12:05:39.377 回答
2

通过指定 AWS 服务的区域列出 DynamoDB 表中所有项目的简单代码。

import boto3

dynamodb = boto3.resource('dynamodb', region_name='ap-south-1')
table = dynamodb.Table('puppy_store')
response = table.scan()
items = response['Items']

# Prints All the Items at once
print(items)

# Prints Items line by line
for i, j in enumerate(items):
    print(f"Num: {i} --> {j}")
于 2020-08-24T03:36:53.390 回答
0

我没有在以下代码上指定 pk:

client = boto3.client('dynamodb')
table = 'table_name'
response = client.scan(
    TableName=table,
    AttributesToGet=['second_field_in_order', 'first_field_in_order']
)
于 2021-10-28T22:42:44.187 回答
-2

此 C# 代码是使用 BatchGet 或 CreateBatchGet 从 dynamodb 表中获取所有项目

        string tablename = "AnyTableName"; //table whose data you want to fetch

        var BatchRead = ABCContext.Context.CreateBatchGet<ABCTable>(  

            new DynamoDBOperationConfig
            {
                OverrideTableName = tablename; 
            });

        foreach(string Id in IdList) // in case you are taking string from input
        {
            Guid objGuid = Guid.Parse(Id); //parsing string to guid
            BatchRead.AddKey(objGuid);
        }

        await BatchRead.ExecuteAsync();
        var result = BatchRead.Results;

// ABCTable 是表格模态,用于在 dynamodb 中创建 & 要获取的数据

于 2019-12-05T17:09:36.760 回答