5

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

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

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

  1. 查找具有 (id = required_id) 的记录
  2. 如果有一个,并且它有一个名为 的集合label_set,则向该集合添加一个标签
  3. 如果没有具有该 id 的记录,或者现有记录没有名为 的属性label_set,则创建一个记录和一个属性,并使用由标签组成的集合来初始化该属性

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

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

所以我必须使用set to的PUT操作,然后(以防失败)操作。这是两个操作,有点糟糕(因为您为每次操作付费,所以成本将是它们的 2 倍)。Expected{"label_set":{"Exists":false}}ADD

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

使用许多记录(123, 'a'), (123, 'hello')而不是每个对象的一个​​记录与一个集合不是一个解决方案:我想get一次从集合中获取所有值,而不需要任何扫描。

4

4 回答 4

8
于 2012-11-10T02:07:20.287 回答
0

您无法使用集合来做您想做的事,因为 Dynamo Db 不支持空集合。我建议只使用带有自定义模式的字符串并自己构建集合。

于 2012-10-10T21:27:15.600 回答
0

也许你可以:(伪代码)

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

使用这种优雅的恢复方法,一般情况下需要 1 次调用,否则需要 2 次。

于 2012-08-19T23:09:45.103 回答
0

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

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

源文档。

编辑:我找到了一个关于如何使用条件语句的非常好的指南

于 2015-10-11T19:07:13.090 回答