2012-07-28 6 views
4

고유 ID를 가진 많은 개체가 있습니다. 모든 개체는 다음과 같이, 그것에 관련된 여러 레이블을 가질 수 있습니다 내가 DynamoDB의 모든 개체, 라벨의이 세트를 저장하기 위해 계획하고 있지 않다dynamodb 문자열 집합 만들기

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

. 그래서 그런 식으로 레이블을 추가하는 것이 할 것 :

  1. 이 (ID = needed_id)
  2. 가 하나이며, 그것은 label_set라는 집합이
  3. 설정에 레이블을 추가있는 경우와 기록을 찾을 수
  4. 같은 ID를 가진 레코드 또는, 속성이 label_set라는 이름이 기록과 속성을 만들고, 내가 사용하는 경우 라벨

로 구성된 세트 속성을 초기화하지 않는 기존 레코드가없는 경우 숫자 집합, 그냥사용할 수 있습니다. UPDATE 명령의3210 조작 이 명령은 내가 설명한 것과 똑같습니다. 그러나,이 문자열의 집합 작동하지 않습니다 : 어떤 항목은 지정된 기본 키와 일치하지

경우
추가 -는 속성 값에 대한 공급 기본 키 및 번호 (또는 숫자의 집합)에 항목을 작성합니다. 문자열 유형에는 유효하지 않습니다.

는 그래서 {"label_set":{"Exists":false}}Expected 세트와 PUT 동작을 사용할 필요가, 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가 작동하지 않습니다. 지정된 값이 숫자 값에 추가되거나 (증가 또는 기존 숫자 값 감소) 문자열 세트에 값으로 추가됩니다. 값 집합을 지정하면 값은 이 기존 집합에 추가됩니다. 예를 들어 원래 세트가 [1,2] 이고 제공된 값이 [3]이면 추가 작업 후 [4,5]가 아닌 [1,2,3]입니다. 에 대해 추가 조치가 지정되고 지정된 속성 유형이 기존 설정 유형과 일치하지 않으면 오류가 발생합니다.

존재하지 않는 특성에 대해 ADD를 사용하면 해당 특성과 값이 항목에 추가됩니다.

세트가 비어 있으면 속성이 없음을 의미합니다. 여전히 ADD 일 수 있습니다. 사실 유용한 패턴은 ADD으로 항목을 확인하지 않고 간단히 처리하는 것입니다. 존재하지 않으면 지정한 키를 사용하여 새 항목을 만들고 추가 할 값으로 특성 집합을 만듭니다. 항목이 있지만 속성이 없으면 속성 세트를 작성하고 값을 추가합니다. 둘 다 존재하면 값을 더합니다.

나를 처음 잡았던 유일한 단점은 단 하나의 문자열 값이더라도 SS (문자열 세트)이라는 값을 추가해야한다는 것입니다. DynamoDB의 관점에서 보면 기존 세트가 빈 세트 (누락)이거나 새 세트에 하나의 값만 들어 있어도 세트를 항상 병합합니다.

IMO, 의도를 묘사 한 방식에서 기존 조건을 지정하지 않는 것이 좋습니다. 두 가지 다른 상황을 강요하지만 두 가지 모두에서 동일한 작업을 수행하려고하므로 두 단계를 수행해야합니다. 맹목적으로 레이블을 추가하고 DynamoDB가 나머지를 처리하도록 할 수 있습니다.

0

두 가지 작업을 피하기 위해 항목에 "ConditionExpression"을 추가 할 수 있습니다. 예를 들어 , 당신의 품목이 필드/값을 추가

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

Source documentation.

편집 : 나는 조건문을 사용하는 방법에 대한 정말 좋은 guide을 발견