2017-09-12 29 views
0

我試圖使用batchGetItem從表中返回多個項目的屬性,但似乎只適用於分區鍵和範圍鍵的組合,但如果我想識別請求的項目只能通過主鍵?唯一的辦法是創建沒有範圍鍵的表格?dyanmodb batchGetItem和分區鍵和排序鍵

// Adding items 
    $client->putItem(array(
     'TableName' => $table, 
     'Item' => array(
      'id'  => array('S' => '2a49ab04b1534574e578a08b8f9d7441'), 
      'name' => array('S' => 'test1'), 
      'user_name' => array('S' => 'aaa.bbb') 
     ) 
    )); 

    // Adding items 
    $client->putItem(array(
     'TableName' => $table, 
     'Item' => array(
      'id'  => array('S' => '4fd70b72cc21fab4f745a6073326234d'), 
      'name' => array('S' => 'test2'), 
      'user_name' => array('S' => 'aaaa.bbbb'), 
      'user_name1' => array('S' => 'aaaaa.bbbbb') 
     ) 
    )); 

$client->batchGetItem(array(
    "RequestItems" => array(
     $table => array(
      "Keys" => array(
       // hash key 
       array(
        "id" => array('S' => "2a49ab04b1534574e578a08b8f9d7441"), 
       // range key 
        "name" => array('S' => "test1"), 
       ), 
       array(
       // hash key 
        "id" => array('S' => "4fd70b72cc21fab4f745a6073326234d"), 
       // range key 
        "name" => array('S' => "test2"), 
       ), 
      ) 
     ) 
    ) 
)); 

按照官方文檔:

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html

如果表中有一個複合主鍵(分區鍵和分類鍵), DynamoDB計算分區鍵的哈希值以與數據分配:分區密鑰中所述相同的方式,但它將所有具有相同分區密鑰值的項目的所有 存儲在一起,物理地關閉 在一起,順序按排序鍵值排序。

使用Partition Key and Sort Key旁邊的優點是什麼使用相同的分區鍵值存儲物理上靠得很近的所有項目?

按照官方文檔:

單一操作可以檢索多達16個MB的數據,它可以包含 多達100個項目。 BatchGetItem將返回如果 超出響應的大小限制,超過該表的置備 吞吐量,或者發生內部處理失敗的局部結果。

如何處理請求,如果我需要更多的則100個項目?剛剛通過的所有項目從每一次的代碼,並要求100倍或有另一種方式通過AWS SDK DynamoDB來實現它循環?創建表的

例子:

$client->createTable(array(
     'TableName' => $table, 
     'AttributeDefinitions' => array(
      array(
       'AttributeName' => 'id', 
       'AttributeType' => 'N'  
      ), 
      array(
       'AttributeName' => 'name', 
       'AttributeType' => 'S' 
      ) 
     ), 
     'KeySchema' => array(
      array(
       'AttributeName' => 'id', 
       'KeyType'  => 'HASH' 
      ), 
      array(
       'AttributeName' => 'name', 
       'KeyType'  => 'RANGE' 
      ) 
     ), 
     'ProvisionedThroughput' => array(
      'ReadCapacityUnits' => 5, 
      'WriteCapacityUnits' => 5 
     ) 
    )); 

感謝

更新 - 問題標記B答案:

是的,你可以創建一個沒有範圍的關鍵指標。範圍關鍵是 完全可選的。但是,即使您定義了範圍鍵,也可以使用 將其包含在查詢中。您可以簡單地在查詢中指定密鑰 以獲取所有具有散列密鑰的項目,這將根據範圍密鑰按順序返回 。

如果我指定與哈希鍵和範圍鍵,我得到下面的錯誤,一表我的查詢只哈希鍵如果我指定我的查詢表上沒有範圍的關鍵它只能哈希鍵。 請注意表沒有索引。

An uncaught Exception was encountered 

Type:  Aws\DynamoDb\Exception\DynamoDbException 
Message:  Error executing "BatchGetItem" on "https://dynamodb.eu-central-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://dynamodb.eu-central-1.amazonaws.com` resulted in a `400 Bad Request` response: 
{"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema" (truncated...) 
ValidationException (client): The provided key element does not match the schema - {"__type":"com.amazon.coral.validate#ValidationException","message":"The provided key element does not match the schema"} 
Filename: /var/app/vendor/aws/aws-sdk-php/src/WrappedHttpHandler.php 

回答

1

,但如果我想只有主 鍵識別請求的項目?是唯一的出路是沒有的範圍鍵創建表?

是的,你可以創建一個沒有範圍鍵的索引。範圍鍵完全是可選的。但是,即使您定義了範圍鍵,也可以將其包含在查詢中。您只需在查詢中指定散列鍵即可使用散列鍵獲取所有項目,散列鍵將以基於範圍鍵的順序返回。

什麼是使用分區鍵和排序鍵旁邊 存儲所有的項目具有相同分區鍵值物理 併攏優勢?

合併的兩個字段是您的主鍵,它保證了唯一性。範圍/排序鍵也決定返回結果的順序。

如何處理請求,如果我需要超過100個項目?

從文檔(重點煤礦):

,可以爲一個 單個操作來檢索項目的屬性的最大數量是100。而且,檢索項數是 約束通過1 MB的大小限制。如果由於內部處理 失敗而導致超出響應大小限制 或返回部分結果,Amazon DynamoDB 將返回未處理的值,因此您可以 重試從下一項獲取的操作。

例如,即使你問檢索100個項目,但每個 單個項目是50K的大小,系統會返回20個項目和 適當UnprocessedKeys值,因此你可以得到 結果下一頁。 如果需要,您的應用程序需要自己的邏輯 將結果頁面彙編到一個集合

所以,你需要檢查結果的UnprocessedKeys值,然後繼續做你的應用程序的請求,直到有沒有更多的UnprocessedKeys

+0

我對您的回答發表了評論,我更新了我的問題,請您檢查一下,謝謝。 – Berlin

+0

@Berlin我認爲你需要發出一個'Query'而不是'BatchGetItem'請求。 –

+0

與'查詢'工作,但我更喜歡使用'BatchGetItem'的性能。 – Berlin

1

你問了很多問題,所以我會盡量分解它。 (對不起,我不能回答的PHP代碼片段的問題)

我試圖用batchGetItem從表中返回一個以上項目 的屬性,但是似乎它只能與 分區鍵的組合和範圍鍵,但如果我想僅通過主鍵識別 請求的項目,該怎麼辦?唯一的辦法是創建沒有範圍鍵的 表?

BatchGetItem與多個GetItem調用相同。基本上,每個GetItem調用檢索零個或一個項目。 你給它一個你想要檢索的項目(主鍵)的唯一鍵。如果你的表只有分區鍵,那麼就是你指定的全部,否則分區和範圍鍵。 BatchGetItem批處理GetItem在對DynamoDB的一個請求中調用。

如果您希望查詢給定分區鍵的多個項目,您可以查看Query API

什麼是使用分區鍵和排序鍵旁邊 存儲所有的項目具有相同分區鍵值物理 併攏優勢?

這是一個難以回答的問題,因爲它很大程度上取決於數據模型的唯一鍵。

浮現在腦海中的一些優點是:1。 排序鍵使您可以在該屬性的數據進行排序(升序或降序) 2.排序鍵有更多的比較操作(即:大於,小於,之間,開始等)。見docs

如何處理請求,如果我需要更多的則100個項目?只需循環 通過代碼中的所有項目並請求每次100次或 還有另一種方法通過AWS SDK DynamoDB實現它?

如果您請求超過100個項目,BatchGetItem將返回一個ValidationException,並顯示消息「爲BatchGetItem調用請求的項目太多」。你需要循環100次,才能得到所需的所有物品。請記住,還有一個16MB的大小限制,這意味着如果有任何項目未處理,它們將在「未處理項目」下的響應中返回。

如果DynamoDB返回任何未處理的項目,則應該重試這些項目的批處理操作。但是,我們強烈建議您使用指數退避算法。如果立即重試批處理操作,則由於對各個表進行限制,底層的讀取或寫入請求仍可能失敗。如果使用指數退避延遲批處理操作,批處理中的各個請求更有可能成功。

documentation解釋如何使用它。

+0

因此,在使用'Partition and Range key'的表的情況下,我必須在使用'batchGetItem'時指定它們兩個嗎?你也建議只循環通過我的PHP代碼中的項目超過100個項目或更多,然後16MB的情況? – Berlin