【发布时间】:2015-03-02 10:38:17
【问题描述】:
考虑以下 DynamoDb 表:
表名:foo-bar
哈希键:Foo, str
范围键: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()
}
});
然后是item的插入:
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不会阻止插入。
【问题讨论】:
-
我不熟悉
vogels,但是如果您将expression attribute name placeholder 用于属性name,会发生什么? IE。"foo <> :foo AND #n <> :name";,然后是params.ExpressionAttributeNames = {"#n": "name"}。我想知道错误是否被吞没了,还是因为name is a reserved word. -
嘿@Mike,感谢您的提醒,但出于保密原因,我不得不擦掉这些名字。这些不是实际名称。
标签: amazon-web-services amazon-dynamodb