我有很多具有唯一ID的对象。每个对象可以具有与其关联的多个标签,如下所示:
123: ['a', 'hello']
456: ['dsajdaskldjs']
789: (no labels associated yet)
Run Code Online (Sandbox Code Playgroud)
我不打算将所有这些对象仅存储在DynamoDB中。因此添加这样的标签将很有意义:
label_set,请向该集合添加标签label_set,则创建一个记录和一个属性,并使用由标签组成的集合初始化该属性如果使用数字集,则可以仅ADD使用UPDATE命令操作。此命令完全符合我的描述。但是,这不适用于字符串集:
如果没有项目与指定的主键匹配:
ADD-创建一个具有提供的主键和数字(或数字集)作为属性值的项目。对于字符串类型无效。
因此,我必须使用一个设置为的PUT操作,然后再进行操作(以防失败)。这是两个操作,有点糟(因为您每次操作都要付费,所以其成本将是可能的2倍)。Expected{"label_set":{"Exists":false}}ADD
这种限制对我来说似乎很奇怪。为什么某些适用于数字集的东西不适用于字符串集?也许我做错了。
使用多个记录(123, 'a'), (123, 'hello')而不是每个对象与一组记录代替一个解决方案不是解决方案:我希望get一次从该集中获取所有值,而不进行任何扫描。
我一直以您描述的方式使用Java SDK中的字符串集,它对我有用。也许已经改变了?我基本上遵循此文档中的模式:
http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/API_UpdateItem.html
ADD-仅对数字或目标属性为集合(包括字符串集合)时使用加法操作。如果目标属性是单个字符串值或标量二进制值,则ADD不起作用。将指定的值添加到数字值(递增或递减现有数字值),或作为附加值添加到字符串集中。如果指定了一组值,则将这些值添加到现有组中。例如,如果原始集合为[1,2],提供的值为[3],那么在加法运算之后,集合为[1,2,3],而不是[4,5]。如果为集合属性指定了添加操作,并且指定的属性类型与现有集合类型不匹配,则会发生错误。
如果将ADD用于不存在的属性,则该属性及其值将添加到该项目中。
当您的集合为空时,表示该属性不存在。您仍然ADD可以。实际上,我发现有用的一种模式是完全ADD不检查项目。如果不存在,它将使用指定的键创建一个新项目,并使用我要添加的值创建属性集。如果该项目存在,但属性不存在,它将创建属性集并添加值。如果它们都存在,则仅添加值。
起初吸引我的唯一一块就是我必须添加的值是一个SS(字符串集),即使它只是一个字符串值。从DynamoDB的角度来看,即使现有集合是一个空集合(缺失)或新集合仅包含一个值,您也始终在合并集合。
IMO,从您描述意图的方式出发,最好完全不指定现有条件。您必须执行两个步骤,因为要强制执行两种不同的情况,但是您试图在两种情况下都执行相同的操作。因此,最好也盲目添加标签,然后让DynamoDB处理其余的标签。
也许你可以:(伪代码)
try:
add_with_update_item(hash_key=42, "label")
except:
element = new Element(hash_key=42, labels=["label"])
element.save()
Run Code Online (Sandbox Code Playgroud)
使用这种优雅的恢复方法,一般情况下您需要 1 次调用,否则需要 2 次调用。
| 归档时间: |
|
| 查看次数: |
8311 次 |
| 最近记录: |