我正在尝试执行batch_get_item来从表中请求多个项目。我在DynamoDB文档中遵循PHP示例,但我没有得到我期望的结果。
以下是代码:
$batch_array = array ();
$batch_array[]= array ('HashKeyElement' =>
array( AmazonDynamoDB::TYPE_STRING => 'V1L3M5O5L1W8R5B6D2Q1S8V0B3R8M7A6R0X0'));
$options = array (
'RequestItems' => array(
'profile_dev' => array (
'Keys' => $batch_array
)
)
);
$result = $this->db->batch_get_item($options);
我没有收到数据,而是得到了很长的响应,而且我还包括了尾部的相关信息:
[x-aws-body] => {"RequestItems":{"profile_dev":{"Keys":[{"HashKeyElement":{"S":"V1L3M5O5L1W8R5B6D2Q1S8V0B3R8M7A6R0X0"}}]}}} ) [body] => CFSimpleXML Object ( [__type] => com.amazon.coral.validate#ValidationException [message] => One or more parameter values were invalid: The provided key size does not match with that of the schema ) [status] => 400 ) )
此表的hashKey是一个字符串。它有一个rangeKey,但我使用的是hashKey,所以我可以获得与hashKey匹配的所有行。我错过了什么?
答案 0 :(得分:6)
DynamoDB文档(和SDK示例)中存在巨大的错误。文档和实际的SDK代码仅使用hashKeyElement,但实际上如果一个表同时具有hashKey和rangeKey,则必须使用它们。
当我同时使用hashKey和rangeKey时,调用工作正常。
答案 1 :(得分:1)
获取(或批量获取)要求您完全定义所有项目的关键字。如果你想使用一次调用检索具有相同hashKey的所有行,看起来你正在寻找Query。
答案 2 :(得分:-1)
您不需要使用BatchGet
,您应该使用Query
。下面是一个使用PHP SDK获取表'YourTable'上的HASH键'YourHashKey'的所有项目的示例
// Instantiate the class
$dynamodb = new AmazonDynamoDB();
$response = $dynamodb->query(array(
'TableName' => 'YourTable',
'HashKeyValue' => array( AmazonDynamoDB::TYPE_STRING => 'YourHashKey' ),
));
参考:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPQuerying.html