我有一个名为products的表,主键为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 for PHP。
9条答案
按热度按时间w6lpcovy1#
Amazon DynamoDB为此目的提供了Scan操作,该操作 * 通过执行表的全扫描 * 返回一个或多个项及其属性。请注意以下两个限制:
备注
如果扫描的项目总数超过1MB限制,则扫描停止,并将结果返回给用户,并提供LastEvaluatedKey,以便在后续操作中继续扫描。结果还包括超出限制的项目数。扫描可能导致没有表数据满足筛选条件。
结果集最终是一致的。
[...]此外,随着表的增长,扫描操作也会变慢。扫描操作会检查每个项是否有请求的值,可能会在一次操作中用完大型表的预配吞吐量。为了缩短响应时间,请以可以使用Query、Get或BatchGetItem API的方式设计表。或者,将应用程序设计为以最小化对表请求率影响的方式使用扫描操作。有关详细信息,请参阅Provisioned Throughput Guidelines in Amazon DynamoDB。[强调我的]
您可以在Scanning Tables Using the AWS SDK for PHP Low-Level API for Amazon DynamoDB中找到有关此操作的更多详细信息和一些示例片段,其中最简单的示例说明了该操作:
iaqfqrcu2#
你可以使用boto3下载。在python中
gc0ot86w3#
我想你正在使用PHP,但没有提到(编辑)。我通过搜索互联网发现了这个问题,因为我得到了解决方案,对于那些使用nodejs的人这里有一个简单的解决方案,使用扫描:
我假设相同的代码也可以*使用不同的AWS SDK转换为PHP
fykwrbwg4#
我使用以下查询从dynamodb中获取所有项。它工作正常。我在zend framework中创建了这些通用函数,并通过项目访问这些函数。
zqry0prt5#
通过指定AWS服务的区域列出DynamoDB表中所有项目的简单代码。
balp4ylt6#
这里有一个Java的例子。在withAttributesToGet中,您可以指定要读取的确切内容。在运行之前,您必须将凭据文件放置到.aws文件夹中。
还指定必要的依赖项。
凭据文件示例
w46czmvw7#
我没有在下面的代码中指定pk:
50few1ms8#
不使用主键和不运行扫描来获取所有行的方法是在表上定义/添加GSI(全局二级索引),并使用可以指定为GSI键的附加属性。在每一行中将此值设置为相同的值(除非您希望将其用于多种用途)
然后对GSI执行查询,指定添加的属性的值。
您可能必须对返回值进行分页。
使用GSI将增加表的大小,并且可能增加成本。
kuarbcqp9#
此C#代码用于使用BatchGet或CreateBatchGet从dynamodb表中获取所有项
// ABCTable是用于在dynamodb中创建的表模型&您想要获取的数据