我真的根本不理解dynamodb的条件表达式应该如何工作,我找不到阅读文档或搜索示例的任何解脱。
在下面的runnable中,我试图在插入项时只允许put-item进入表中,这将保留散列键和另一个表属性的唯一性。
将条件表达式定义为如下所示似乎很简单,但它不起作用。
我的问题是如何才能使put-item成为有条件的,这两个属性在表中是独立的?
#!/usr/bin/env bash
TABLE_NAME="Test"
read -r -d '' ATTRIBUTE_DEFINITIONS << EOF
[
{
"AttributeName": "hashKey",
"AttributeType": "S"
}
]
EOF
read -r -d '' KEY_SCHEMA << EOF
{
"AttributeName": "hashKey",
"KeyType": "HASH"
}
EOF
read -r -d '' THROUGHPUT << EOF
{
"ReadCapacityUnits": 1,
"WriteCapacityUnits": 1
}
EOF
read -r -d '' ITEM1 << EOF
{
"hashKey": { "S": "one" },
"blah": { "S": "foo" }
}
EOF
read -r -d '' ITEM2 << EOF
{
"hashKey": { "S": "one" },
"blah": { "S": "baz" }
}
EOF
read -r -d '' ITEM3 << EOF
{
"hashKey": { "S": "two" },
"blah": { "S": "baz" }
}
EOF
CONDEXP="hashKey<>:hk AND blah<>:bh"
read -r -d '' EXPVALUES2 << EOF
{
":hk": { "S": "two" },
":bh": { "S": "baz" }
}
EOF
read -r -d '' EXPVALUES3 << EOF
{
":hk": { "S": "two" },
":bh": { "S": "baz" }
}
EOF
aws dynamodb create-table \
--table-name "$TABLE_NAME" \
--attribute-definitions "$ATTRIBUTE_DEFINITIONS" \
--key-schema "$KEY_SCHEMA" \
--provisioned-throughput "$THROUGHPUT"
aws dynamodb put-item \
--table-name "$TABLE_NAME" \
--item "$ITEM1"
# BUG: I want this this fail because the hashKey in
# ITEM2 is already in the table. It doesn't fail
aws dynamodb put-item \
--table-name "$TABLE_NAME" \
--item "$ITEM2" \
--condition-expression "$CONDEXP" \
--expression-attribute-values "$EXPVALUES2"
# BUG: I want this this fail because the blah in
# ITEM3 is already in the table
aws dynamodb put-item \
--table-name "$TABLE_NAME" \
--item "$ITEM3" \
--condition-expression "$CONDEXP" \
--expression-attribute-values "$EXPVALUES3"
答案 0 :(得分:1)
条件表达式仅在一个项的上下文中起作用。属性的唯一性是表全局属性。虽然您可以使用attribute_not_exists(hk)对不存在键进行写入(放置/更新/删除项),但该表本身不会确保其他属性的唯一性。您可以在表上启用Stream,在attach a Lambda function启用填充第二个属性bh上的物化视图的流,并检查物化视图的bh唯一性,然后在基础上进行条件写入表。注意,在这种方法中,物化视图bh检查和条件写入基表之间存在竞争条件,您可能需要根据应用程序进行处理。