Dynamodb。如何将item条件置于两个唯一属性,其中一个是散列键?

时间:2015-02-13 13:09:49

标签: amazon-dynamodb aws-cli

我真的根本不理解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"

1 个答案:

答案 0 :(得分:1)

条件表达式仅在一个项的上下文中起作用。属性的唯一性是表全局属性。虽然您可以使用attribute_not_exists(hk)对不存在键进行写入(放置/更新/删除项),但该表本身不会确保其他属性的唯一性。您可以在表上启用Stream,在attach a Lambda function启用填充第二个属性bh上的物化视图的流,并检查物化视图的bh唯一性,然后在基础上进行条件写入表。注意,在这种方法中,物化视图bh检查和条件写入基表之间存在竞争条件,您可能需要根据应用程序进行处理。