动态模块。如何以两个唯一属性为条件放置项目,其中一个是哈希键?
Dynamodb. How to put-item conditional on two unique attributes where one is hash key?
我真的完全不理解 dynamodb 的条件表达式应该如何工作,阅读文档或搜索示例我找不到任何解脱。
在下面的 runnable 中,我试图只允许将一个 put-item 放入 table 中,当插入该项目时将保留哈希键和另一个 table 属性的唯一性。
把条件表达式定义成如下所示似乎很简单,但它不起作用。
我的问题是如何使 put-item 以两个属性在 table 中分别唯一为条件?
#!/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"
条件表达式仅在一项的上下文中有效。属性的唯一性是 table-全局 属性。虽然您可以使用 attribute_not_exists(hk) 在键不存在的情况下写入 (Put/Update/Delete Item),但 table 本身并不能确保其他属性的唯一性。您可以启用 Stream on the table and attach a Lambda function 到流,该流填充以您的第二个属性 bh 为键的实体化视图,并检查实体化视图的 bh 唯一性,然后在基础 table 上执行条件写入。注意,在这种方法中,实体化视图 bh 检查和条件写入基 table 之间存在竞争条件,您可能必须解决,具体取决于您的应用程序。
我真的完全不理解 dynamodb 的条件表达式应该如何工作,阅读文档或搜索示例我找不到任何解脱。
在下面的 runnable 中,我试图只允许将一个 put-item 放入 table 中,当插入该项目时将保留哈希键和另一个 table 属性的唯一性。
把条件表达式定义成如下所示似乎很简单,但它不起作用。
我的问题是如何使 put-item 以两个属性在 table 中分别唯一为条件?
#!/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"
条件表达式仅在一项的上下文中有效。属性的唯一性是 table-全局 属性。虽然您可以使用 attribute_not_exists(hk) 在键不存在的情况下写入 (Put/Update/Delete Item),但 table 本身并不能确保其他属性的唯一性。您可以启用 Stream on the table and attach a Lambda function 到流,该流填充以您的第二个属性 bh 为键的实体化视图,并检查实体化视图的 bh 唯一性,然后在基础 table 上执行条件写入。注意,在这种方法中,实体化视图 bh 检查和条件写入基 table 之间存在竞争条件,您可能必须解决,具体取决于您的应用程序。