2015-03-01 3 views
2

Рассмотрим следующую таблицу: 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 не блокирует вставку.

+1

Я не знаком с '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

+0

Эй, @Mike, спасибо для руководителей, однако мне пришлось вычистить имена по соображениям конфиденциальности. Это не настоящие имена. – Snake

ответ

5

Причина, по которой DynamoDB вставляет ваш элемент, заключается в том, что в вашей таблице используется составной ключ hashkey: foo, rangekey: bar. Вы пытаетесь вставить элемент с другим ключом, в этом случае hashkey: foo, rangekey: bar2. В DynamoDB при вставке элемента выражения условий проверяются только на существующий элемент, соответствующий точно таким же клавишам хэша и диапазона.

Вы пытаетесь добавить уникальное ограничение для неключевого атрибута, в настоящее время это не возможно с DynamoDB и потребует изменения схемы для принудительного применения этого ограничения.

Смежные вопросы