dynamodb创建一个字符串集

时间:2012-07-28 14:57:25

标签: amazon-dynamodb

我有很多具有唯一ID的对象。每个对象都可以有几个与之关联的标签,如下所示:

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

我不打算在DynamoDB中存储所有对象,只有这些标签集。所以添加这样的标签是有意义的:

  1. 使用(id = needed_id)
  2. 查找记录
  3. 如果有,并且它有一个名为label_set的集合,请为此集添加标签
  4. 如果没有具有此类ID的记录,或者现有记录没有名为label_set的属性,则创建记录和属性,并使用由标签

    如果我使用了一组数字,我可以使用ADD命令的UPDATE操作。这个命令正是我所描述的。但是,这不适用于字符串集:

      

    如果没有项目与指定的主键匹配:
      ADD-使用提供的主键和属性值的编号(或数字集)创建项目。对字符串类型无效。

    所以我必须使用PUT操作,Expected设置为{"label_set":{"Exists":false}},然后ADD操作跟随(如果失败)。这是两个操作,它有点糟糕(因为你按操作付费,这将是它们的2倍)。

    这种限制对我来说似乎很奇怪。为什么与数字集合有效的东西不能用于字符串集?也许我做错了什么。

    使用许多记录(如(123, 'a'), (123, 'hello')而不是每个对象的一个​​记录都不是解决方案:我希望一次get来自集合的所有值,而不进行任何扫描。

4 个答案:

答案 0 :(得分:5)

我一直使用Java SDK中的字符串集,这对我来说很有用。也许它已经改变了?我基本上遵循这个文档中的模式:

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

  

ADD - 仅对数字使用添加操作或目标属性为   一组(包括字符串集)。如果目标,ADD不起作用   attribute是单个字符串值或标量二进制值。该   指定的值被添加到数值(递增或   递减现有数值)或作为附加添加   字符串集中的值。如果指定了一组值,则值为   添加到现有集。例如,如果原始集是[1,2]   并且提供的值是[3],然后在添加操作之后设置为   [1,2,3],而不是[4,5]。如果为其指定了“添加”操作,则会发生错误   set属性和指定的属性类型不匹配   现有的集合类型。

     

如果对不存在的属性使用ADD,则属性和   其值将添加到项目中。

当您的集合为空时,表示该属性不存在。你仍然可以ADD。事实上,我发现有用的模式只是ADD,甚至没有检查项目。如果它不存在,它将使用指定的键创建一个新项,并使用我添加的值创建属性集。如果项目存在但属性不存在,则会创建属性集并添加值。如果它们都存在,则只添加值。

最初吸引我的唯一一件事就是我必须添加的值是SS(字符串集),即使它只是一个字符串值。从DynamoDB的角度来看,即使现有集合是空集(缺失)或新集合只包含一个值,您也始终合并集合。

IMO,从您描述您的意图的方式来看,您最好不要指定现有条件。您必须执行两个步骤,因为您正在执行两种不同的情况,但您尝试在两者中执行相同的操作。所以不妨盲目地添加标签,让DynamoDB处理剩下的事情。

答案 1 :(得分:0)

也许你可以:(伪代码)

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

使用这种优雅的恢复方法,您需要在一般情况下进行1次呼叫,否则需要2次。

答案 2 :(得分:0)

您无法使用集合执行所需操作,因为Dynamo Db不支持空集。我建议只使用带有自定义模式的字符串并自己构建集合。

答案 3 :(得分:0)

要避免两个操作,可以在项目中添加“ConditionExpression”。 例如,将此字段/值添加到您的项目中:

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

Source documentation.

编辑:我发现了一个非常好的guide关于如何使用条件语句