2012-12-12 58 views
2

我想要做一個batch_get_item來請求表中的多個項目。我正在關注DynamoDB文檔中的PHP示例,但我沒有得到我期待的結果。DyanmoDB:沒有得到我期待的答案batch_get_item

以下是代碼:

$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匹配的所有行。我錯過了什麼?

回答

5

DynamoDB文檔(和SDK示例)中包含巨大的錯誤。文檔和實際的SDK代碼僅使用hashKeyElement,但實際上如果一個表同時具有hashKey和rangeKey,則必須使用這兩者。

當我同時使用hashKey和rangeKey時,調用工作。

+0

是的,他們在某些方面可怕的文檔。 getItem的API文檔表明,使用散列範圍,必須提供兩件事才能獲取項目。鑑於這種不受約束的約束,我還沒有想到這種密鑰的一個很好的用例。 –

+0

@DavidPelaez爲了獲得一個你需要提供的物品,但是要獲得一組物品,你可以在第一個物品上查詢,並根據第二個物品獲取所有匹配的物品。 –

1

獲取(或批量獲取)要求您完全定義您獲得的所有項目的關鍵。如果您想通過一次調用檢索具有相同hashKey的所有行,那麼您似乎在尋找Query。

+0

不,我正在尋找與各種hashKeys匹配的項目。查詢用於其他目的,查詢可在單個表上使用。 – EastsideDeveloper

-1

你不需要使用BatchGet,你應該使用Query。下面是使用PHP SDK來獲得對錶「YourTable」

// Instantiate the class 
$dynamodb = new AmazonDynamoDB(); 

$response = $dynamodb->query(array(
    'TableName' => 'YourTable', 
     'HashKeyValue' => array(AmazonDynamoDB::TYPE_STRING => 'YourHashKey'), 
)); 

參考用HASH鍵「YourHashKey」所有項目的例子:http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/LowLevelPHPQuerying.html

+0

不,我正在專門查找BatchGetItem的用法。我正在檢索多個不匹配相同hashKey並可能來自不同表的項目。我提供了答案。 Amaazon SDK和示例代碼是錯誤的。 – EastsideDeveloper

+0

沒有'BatchQuery',只有'BatchGet',GET表示你知道HASH和RANGE。 BatchQuery將是一個很酷的功能,但它不存在。文檔或PHP SDK中沒有任何不正確的地方,可能不是很清楚,但沒有錯誤。 – greg

+0

另外,如果您在與DynamoDB相同的區域使用EC2,則返回行程小於4ms,因此使用BATCH函數並不會引發多重請求。 – greg

相關問題