DynamoDb with ConditionExpression



考虑以下DynamoDb表:

表名:foo-bar哈希密钥:Foo, strRangeKey:Bar, str名称:Baz, str

现在使用vogels API,我尝试插入一个带有HashKey、新RangeKey和Name的项。

但是对于给定的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没有阻止插入。

DynamoDB之所以插入您的项,是因为您的表使用了hashkey:foo,rangekey:bar的复合键。您正试图插入一个具有不同键的项,在本例中为hashkey:foo,rangekey:bar2。在DynamoDB中,当插入一个项时,条件表达式只针对与哈希和范围键完全匹配的现有项进行测试。

您正试图在非键属性上添加唯一约束,DynamoDB目前不可能这样做,并且需要更改模式才能强制执行此约束。

相关内容

  • 没有找到相关文章

最新更新