2012-07-28 80 views
4

我有很多對象具有唯一的ID。每個對象都具有與之相關聯的,像這樣幾個標籤:dynamodb創建字符串集

123: ['a', 'hello'] 
456: ['dsajdaskldjs'] 
789: (no labels associated yet) 

我不打算以存儲DynamoDB的所有對象,只有這些組的標籤。因此,這將是有意義的添加標籤這樣的:

  1. 找到(ID = needed_id)
  2. 如果有的話,它有一個名爲label_set集,添加一個標籤,將其設置
  3. 紀錄
  4. 如果有這樣的ID沒有記錄,或現有的記錄沒有屬性命名爲label_set,創建一個記錄和屬性,並初始化了一組由標籤

的,如果我使用的屬性一組數字,我只能用ADD操作的UPDATE命令。這個命令正是我所描述的。然而,這不與琴絃組工作:

如果沒有項目指定的主鍵相匹配:
ADD-創建具有該屬性值供給主鍵和號碼(或一組號碼)項。對於字符串類型無效。

所以必須使用一個PUT操作與Expected設置爲{"label_set":{"Exists":false}},隨後(如果它失敗)通過ADD操作。這是兩個操作,它有點不好(因爲你每次操作付費,這個成本將比它們高出2倍)。

這個限制對我來說似乎很奇怪。爲什麼用數字設置的東西不適用於字符串集?也許我做錯了什麼。

使用像(123, 'a'), (123, 'hello')而不是每個對象的一個​​記錄了一組多條記錄是不是一個解決方案:我想get所有值從集合一次,沒有任何掃描。

回答

0

也許你可以:(僞代碼)

try: 
    add_with_update_item(hash_key=42, "label") 
except: 
    element = new Element(hash_key=42, labels=["label"]) 
    element.save() 

有了這個優雅的恢復方法,你需要在一般情況下1個呼叫,否則2。

0

由於Dynamo Db不支持空集,因此無法使用集合執行所需操作。我建議只使用一個帶有自定義模式的字符串並從中自行構建該組。

4

我使用Java SDK中的字符串集合來描述你所有的時間和方式。也許它已經改變了?我基本上遵循的模式在這個文檔:

http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_UpdateItem.html

ADD-僅使用添加操作的數字或如果目標屬性是 一組(包括串套)。如果目標 屬性是單個字符串值或標量二進制值,則ADD不起作用。所述 指定的值被添加到一個數字值(遞增或遞減 現有數字值),或添加爲一個字符串組的附加 值。如果指定了一組值,則將值添加到現有組中。例如,如果原來的組是[1,2] 並供給值[3],則加法運算後的設定是 [1,2,3],而不是[4,5]。如果 一組屬性,指定不匹配 現有的集合類型的屬性類型指定的添加操作時發生錯誤。

如果使用添加不存在,屬性和 它的價值被添加到該項目的屬性。

當您的設置爲空時,表示該屬性不存在。你仍然可以ADD。事實上,我發現一個有用的模式就是簡單地ADD,甚至沒有檢查項目。如果它不存在,它將使用指定的鍵創建一個新項目,並使用我要添加的值創建屬性集。如果項目存在但該屬性不存在,則會創建屬性集並添加值(s)。如果它們都存在,它只會增加值(s)。

首先讓我起來的唯一一件事是,我必須添加的值是SS(字符串集),即使它只有一個字符串值。從DynamoDB的角度來看,即使現有集合是空集(缺少),或者新集只包含一個值,您也總是合併集合。

IMO,從你描述你的意圖的方式,你會關閉不指定現有的條件要好。您必須執行兩個步驟,因爲您正在執行兩種不同的情況,但您正試圖在兩者中執行相同的操作。所以不妨盲目添加標籤,讓DynamoDB處理剩下的事情。

0

爲了避免兩次手術,你可以添加一個「ConditionExpression」你的項目。 例如,該字段/值添加到您的項目:

"ConditionExpression": "attribute_not_exists(RecordID) and attribute_not_exists(label_set)" 

Source documentation.

編輯:我發現了一個非常好的guide有關如何使用條件語句