Ответ 1
Вы не можете. Все элементы в DynamoDB индексируются либо их hash
, либо hash
+ range
(в зависимости от вашей таблицы). Один хэш-ключ может иметь несколько клавиш диапазона.
Скажем, например, у вас есть следующие пункты:
-
hash=A,range=1
-
hash=A,range=2
У вас есть 2 возможных результата:
-
Если вы попытаетесь поместить элемент с
hash=A,range=3
иattribute_not_exists(hash)
, вы получитеtrue
. Нет элемента сhash=A,range=3
, который существует с атрибутом с именемhash
. Если вместо этого вы используетеattribute_not_exists(range)
, нет элемента сhash=A,range=3
, который существует с атрибутом с именемrange
, поэтому вы также получитеtrue
. -
Если вы попытаетесь поместить элемент с
hash=A,range=1
иattribute_not_exists(hash)
, вы получитеfalse
там элемент сhash=A,range=3
, который существует с атрибутом с именемhash
. Если вместо этого вы используетеattribute_not_exists(range)
, существует элемент сhash=A,range=3
, который существует с атрибутом с именемrange
.
То, что этот attribute_not_exist
эффективно выполняет для обоих из них, является , если элемент не существует.
Подробное объяснение:
- Каждый элемент имеет как клавиши
hash
, так иrange
- Вы делаете запрос
PutItem
и должны предоставлять какhash
, так иrange
- Вы предоставляете
ConditionExpression
с помощьюattribute_not_exists
на кнопкеhash
илиrange
Это означает, что произойдет одна из двух вещей:
- В базе данных существует пара
hash
+range
.-
attribute_not_exists(hash)
должен бытьtrue
-
attribute_not_exists(range)
должен бытьtrue
-
- Пара
hash
+range
не существует в базе данных.-
attribute_not_exists(hash)
должен бытьfalse
-
attribute_not_exists(range)
должен бытьfalse
-
В обоих случаях вы получаете тот же результат, независимо от того, помещаете ли вы его в хэш или клавишу диапазона. Вы эффективно проверяете, существует ли элемент с этим ключом хэша + диапазона.