Рассмотрим следующую таблицу: DynamoDbDynamoDb с ConditionExpression
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
не блокирует вставку.
Я не знаком с 'vogels', но что произойдет, если вы используете [имя атрибута имени выражения] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames) для атрибута ** name **? То есть '" foo <>: foo И #n <>: name ";', а затем 'params.ExpressionAttributeNames = {" #n ":" name "}'. Мне интересно, если ошибка проглатывается или что-то, потому что [имя зарезервированное слово.] (Http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html) – mkobit
Эй, @Mike, спасибо для руководителей, однако мне пришлось вычистить имена по соображениям конфиденциальности. Это не настоящие имена. – Snake