2012-07-28 84 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有关如何使用条件语句