带有 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