开发者问题收集

带有 ConditionExpression 的 DynamoDb

2015-03-01
4312

考虑以下 DynamoDb 表:

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

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

但给定的 HashKey 不能存在 Name:

因此,我们为 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个回答

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

您尝试在非键属性上添加唯一约束,目前 DynamoDB 无法做到这一点,需要更改架构才能强制实施此约束。

Ryan Fitzgerald
2015-03-02