带有ConditionExpression的DynamoDb

时间:2015-03-01 17:34:02

标签: amazon-web-services amazon-dynamodb

考虑以下DynamoDb表:

TableName:foo-bar HashKey:Foo, str RangeKey:Bar, str 姓名:Baz, str

现在使用vogels API我正在尝试插入带有HashKey,新RangeKey和名称的项目。

但是对于给定的HashKey,名称不得存在:

因此我们定义了vogels API的表格布局:

var foobar = vogels.define("foo-bar", {
    tableName: "foo-bar",
    hashKey: "foo",
    rangeKey: "bar",
    schema: {
        "foo": Joi.string(),
        "bar": Joi.string(),
        "name": Joi.string()
    }
});

然后插入项目:

var itemToInsert = { foo: "foo", bar: "bar2", name: "TEST" };

var params = {};
params.ConditionExpression = "foo <> :foo AND name <> :name";
params.ExpressionAttributeValues = {
    ":foo": itemToInsert.foo,
    ":name": itemToInsert.name
};

foobar
    .create(itemToInsert, params, function(error, data) {
        if(error) {
            console.log(error);
        }
        else {
            console.log(data);
        }
});

表格中已有一项包含以下值的项目:{foo: "foo", bar: "bar", name: "TEST" }

所以我期待系统给我一个错误,因为ConditionExpression已经存在匹配,但是插入的项目没有问题。这对DynamoDb不可能吗?

请注意,无论是使用vogels还是直接使用aws-sdk都无关紧要,两者都有相同的问题,即插入项目并且ConditionExpression不会阻止插入。

1 个答案:

答案 0 :(得分:6)

DynamoDB插入项目的原因是因为您的表使用了hashkey的复合键:foo,rangekey:bar。您正在尝试插入具有不同键的项目,在本例中为hashkey:foo,rangekey:bar2。在DynamoDB中,插入项时,条件表达式仅针对与完全相同的散列和范围键匹配的现有项进行测试。

您正在尝试在非密钥属性上添加唯一约束,目前这可能不适用于DynamoDB,并且需要更改架构才能强制执行此约束。