我有很多具有唯一ID的对象。每个对象都可以有几个与之关联的标签,如下所示:
123: ['a', 'hello']
456: ['dsajdaskldjs']
789: (no labels associated yet)
我不打算在DynamoDB中存储所有对象,只有这些标签集。所以添加这样的标签是有意义的:
label_set
的集合,请为此集添加标签label_set
的属性,则创建记录和属性,并使用由标签
如果我使用了一组数字,我可以使用ADD
命令的UPDATE
操作。这个命令正是我所描述的。但是,这不适用于字符串集:
如果没有项目与指定的主键匹配:
ADD-使用提供的主键和属性值的编号(或数字集)创建项目。对字符串类型无效。
所以我必须使用PUT
操作,Expected
设置为{"label_set":{"Exists":false}}
,然后ADD
操作跟随(如果失败)。这是两个操作,它有点糟糕(因为你按操作付费,这将是它们的2倍)。
这种限制对我来说似乎很奇怪。为什么与数字集合有效的东西不能用于字符串集?也许我做错了什么。
使用许多记录(如(123, 'a'), (123, 'hello')
而不是每个对象的一个记录都不是解决方案:我希望一次get
来自集合的所有值,而不进行任何扫描。
答案 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)"
编辑:我发现了一个非常好的guide关于如何使用条件语句