2017-05-31 34 views
0

在AWS DynamoDB中,您必須指定一個`分區鍵,它可以像GetItem一樣工作......因爲分區鍵是唯一的,所以它應該只返回一個項目,所以如果我知道該項目的ID,它再也沒有意義了!因爲查詢的目的是爲了約束...AWS中的查詢有什麼意義DynamoDB

所以有人可以給我例子查詢一個分區鍵可以返回多個項目?

# Create single-attribute primary key table 
aws dynamodb create-table --table-name testdb6 --attribute-definitions '[{"AttributeName": "Id", "AttributeType": "S"}]' --key-schema '[{"AttributeName": "Id", "KeyType": "HASH"}]' --provisioned-throughput '{"ReadCapacityUnits": 5, "WriteCapacityUnits": 5}' 

# Populate table 
aws dynamodb put-item --table-name testdb6 --item '{ "Id": {"S": "1"}, "LastName": {"S": "Lopez"}, "FirstName": {"S": "Maria"}}' 
aws dynamodb put-item --table-name testdb6 --item '{ "Id": {"S": "2"}, "LastName": {"S": "Fernandez"}, "FirstName": {"S": "Augusto"}}' 

# Query table using only partition attribute 
aws dynamodb query --table-name testdb6 --select ALL_ATTRIBUTES --key-conditions '{"Id": {"AttributeValueList": [{"S": "1"}], "ComparisonOperator": "EQ"}}' 

您也可以只使用EQ運營商爲partition key,所以例如使用BETWEENORIN是不允許的partition key

替代queryscan

  • 掃描是昂貴的(慢)
  • 你無法在掃描上排序

更新

所以我意識到,我可以使用排序鍵,然後在這種情況下partition key可以成爲我的表名,所以我需要改變我的詞彙

  • - >數據庫
  • 分區鍵 - >表/收藏
  • 排序關鍵字 - >主鍵/的ObjectId

例子:我-APIpartition key -> classNamesort key -> id

my-api 
    className | id | username | title 
    _User  | 0 | "bingo" | 
    _User  | 1 | "mimi" | 
    _Song  | 0 |   | "You with me" 

很是怪異設計

+0

查詢使用排序鍵 –

回答

2

如果表中有兩個分區鍵和排序鍵通過分區鍵查詢單獨會給你m多件物品。使用查詢API

  • 排序鍵必須 - - 可選,同時使用查詢API
  • 獲取API

    • 分區鍵: -

      對於複合主鍵,你必須爲 分區鍵和排序鍵提供值。

      因此,獲取API將始終只返回一個項目。此外,沒有過濾器表達式可以通過非關鍵屬性進行過濾。

    +0

    過濾非 - 鍵屬性由其他列該分區鍵,例如過濾 - 您可以創建「全球次級指數」使用非鍵屬性作爲分區鍵。每桌有5 gsi的限制。 –

    0

    查詢是根據主鍵或索引鍵屬性查找項目。主鍵可以有一個分區鍵(散列鍵)和一個可選的範圍鍵。如果Range鍵存在,那麼您可以擁有多個具有相同分區鍵的記錄。因此,要對這種組合主鍵執行GetItem操作,您需要使用散列鍵指定範圍鍵。

    另外,您可以指定多個全局二級索引(GSI)和本地二級索引(LSI),通過它們可以查詢非鍵屬性。

    因此,Query操作爲您提供了基於主鍵,LSI或GSI的散列鍵和Range鍵的屬性來查找項目的方法。

    現在,您使用的示例當然不是設計模式的好方法。


    表!=數據庫

    表==表和DynamoDB房屋所有表。

    UserSong等需要存儲在不同的表中。然後,您可以指定id,username以進一步唯一標識表格中的項目。每個項目可以被認爲是RDBMS中的記錄。閱讀更多關於選擇主鍵和索引以及來自AWS DynamoDB Developer Guide的所有信息

    +0

    告訴我如何使用電子郵件查詢用戶而不知道它的id或用戶名,假設你有一個帶'id'作爲分區鍵和'用戶名'作爲排序/範圍鍵的表用戶,並且每個ID將僅與1個用戶相關聯? – user8065363

    +0

    是的,每個ID都會與用戶關聯。或者,如果您的每個用戶將始終具有唯一的「用戶名」,那麼您可以將'username'指定爲分區鍵。但是,這是您的偏好,通過電子郵件查詢,您可以指定'email'作爲全局二級索引的哈希鍵,這將允許您通過'email'查詢用戶。 –

    0

    如果沒有定義排序鍵,分區鍵將始終返回唯一結果。 將排序鍵配置到表中意味着分區鍵和排序鍵之間的組合必須是唯一的。 對於最佳實踐定義你的表的結構,請參閱this