我有一个名为带主键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。
答案 0 :(得分:41)
Amazon DynamoDB为此目的提供Scan操作,通过执行表的完整扫描来返回一个或多个项及其属性。请注意以下两个限制因素:
根据您的表格大小,您可能需要使用分页来检索整个结果集:
注意强>
如果扫描的项目总数超过1MB限制,则 扫描停止,结果返回给用户 LastEvaluatedKey在后续操作中继续扫描。该 结果还包括超出限制的项目数。扫描 可能导致没有符合过滤条件的表格数据。结果集最终是一致的。
扫描操作在性能和消耗容量单位(即价格)方面可能代价高昂,请参阅Query and Scan in Amazon DynamoDB中的扫描和查询效果部分:
[...]此外,随着表的增长,扫描操作变慢。扫描 操作检查所请求值的每个项目,可以用完 单个操作中大型表的预配置吞吐量。 为了缩短响应时间,请以可以使用的方式设计表 相反,Query,Get或BatchGetItem API。或者,设计你的 应用程序以最小化影响的方式使用扫描操作 在你的桌子上的请求率。有关更多信息,请参阅Provisioned Throughput Guidelines in 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>";
}
答案 1 :(得分:4)
您好,您可以使用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'])
答案 2 :(得分:3)
我认为您正在使用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
答案 3 :(得分: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}")
答案 4 :(得分:0)
我使用以下查询从dynamodb中获取所有项目。它工作正常。我在zend框架中创建了这些函数generic,并在项目中访问这些函数。
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']);
答案 5 :(得分:-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和数据中创建