SimpleDB:仅在项目尚不存在时插入项目

时间:2011-02-13 22:10:14

标签: database amazon amazon-simpledb

我希望只有在没有其他项目具有相同项目名称的情况下才向Amazon SimpleDB域添加新项目。

我知道如何为属性执行此操作。但我希望检查项目名称以确保它是唯一的,并且它不会覆盖现有项目 - 当然没有额外的选择查询。

检查属性的示例:

https://sdb.amazonaws.com/
?Action=PutAttributes
&DomainName=MyDomain
&ItemName=JumboFez
&Attribute.1.Name=quantity
&Attribute.1.Value=14
&Attribute.1.Replace=true
&Expected.1.Name=quantity
&Expected.1.Exists=false
&AWSAccessKeyId=[valid access key id]
[...]

根据FAQ,这应该是可能的:

  

“这些语义也可用于实现计数器等功能,只有在项目尚不存在的情况下插入项目[...]”

2 个答案:

答案 0 :(得分:2)

你是对的,你可以使用条件put来实现这个SimpleDB Docs conditional puts

基本上,您知道的项目上的任何属性都可以与条件更新的存在性检查一起使用,以确保仅在该特定itemName的属性不存在时才会发生put。

在使用amazon java SDK的java中,这看起来像是: -

// add a conditional check to ensure that the specified profile does not already
// exist - if there's a timestamp, then this profile already exists
UpdateCondition condition = new UpdateCondition("quantity", null, false);

final PutAttributesRequest request = new PutAttributesRequest().withDomainName("MyDomain");
request.setItemName("JumboFez");
request.setAttributes(attributes);
request.setExpected(condition);

sdb.putAttributes (request);

只要您从未拥有没有“数量”属性的有效项目,这基本上会减少到您所写的内容并且会执行您想要的操作。

可能值得注意的是,在您的示例中,您将set替换为true,如果您使用条件放置以确保该项是新项,则您不需要设置replace = true(根据文档和经验证据,替换=真实成本超过替换=假并且需要更长时间。)

答案 1 :(得分:-1)

您可以根据当前时间戳生成项目名称。 并使用%方法来获取结果。