动态模块。如何以两个唯一属性为条件放置项目,其中一个是哈希键?

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 之间存在竞争条件,您可能必须解决,具体取决于您的应用程序。