Amazon web services DynamoDB PutItem中的非预期结果

Amazon web services DynamoDB PutItem中的非预期结果,amazon-web-services,amazon-dynamodb,dynamodb-queries,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,Q:当我有一个复合主键时,如何避免将项目插入表中? 我只能在文档中找到带有单个主键(只有分区键,但没有分区键和排序键)的示例 上下文: 我的分区键名为PK,排序名为SK 我的PK是一个UUID,SK由一个随机bucket[0-9]组成,例如,“user#info#3”(3是随机bucket) 同一个PK可能出现多次,但每次重复的SK总是不同的 我只想在(PK不存在)或(PK存在且SK不以user#info开头)时在表中插入项 我的期望与我的结果 [结果:预期-未插入项目]如果我尝试插入一个

Q:当我有一个复合主键时,如何避免将项目插入表中?

我只能在文档中找到带有单个主键(只有分区键,但没有分区键和排序键)的示例

上下文:

  • 我的分区键名为PK,排序名为SK
  • 我的PK是一个UUID,SK由一个随机bucket[0-9]组成,例如,“user#info#3”(3是随机bucket)
  • 同一个PK可能出现多次,但每次重复的SK总是不同的
  • 我只想在(PK不存在)或(PK存在且SK不以user#info开头)时在表中插入项
我的期望与我的结果

  • [结果:预期-未插入项目]
    如果我尝试插入一个具有现有主键和确切主键的项目(例如,插入用户信息3和用户信息3已存在),则不应插入该项目
  • [结果:非预期-项目已插入]
    如果我尝试插入一个PK存在且SK不准确的项目(例如,插入用户信息3和用户信息5已存在),则不应插入该项目
  • [结果:预期-项目已插入]
    如果我尝试插入一个PK不存在的项目,则应插入该项目
我正在使用此命令行代码段(修改自)将数据插入表中:

aws dynamodb put-item \
    --table-name Users \
    --item file://item.json \
    --condition-expression "attribute_not_exists(PK) OR NOT begins_with(SK, :sk)" \
    --expression-attribute-values file://values.json
item.json

{
    "PK": {
        "S": "910cc6dd-b7e2-4286-89d4-db3d0e3fde6b"
    },
    "SK": {
        "S": "user#info#4"
    },
    "Name": {
        "S": "Greg"
    }
}
values.json

{
    ":sk": {
        "S": "user#info"
    }
}
如果我删除PK条件,并尝试仅针对SK条件进行检查,则会插入项目(我希望它不会插入项目),例如:


上面插入了该项,尽管表中还有另一项以
user\info

开头,但DynamoDB不是这样工作的。你能不能把你的排序键设置成“user#info”,然后把数字移到另一个属性上?我之所以添加随机桶数,是因为SK中的基数很低,数据也有偏差(其他值更常见)。为了支持多个查询模式,我需要在GSI视图中使用SK作为PK,以便不让单个分区过载查询,我添加了随机bucket。你能解释一下为什么你说DynamoDB不是这样工作的吗?你评论中的“这”到底是什么意思?对不起,我应该包括更多的细节。DynamoDB写入仅对单个文档进行操作。您的问题意味着您希望它基于具有相同分区键的所有文档的查询有条件地执行写操作;它不能/不能做到这一点,操作只能“看到”具有确切PK+SK组合的文档。另外,如果bucket的数量是固定的且足够小,您可以通过包含每个可能bucket的条件检查的事务来完成这一点。不过这会很贵。哦,这很有道理。这是一个不常见的问题,所以你的建议很适合。谢谢你的洞察力。
aws dynamodb put-item \
    --table-name Users \
    --item file://item.json \
    --condition-expression "NOT begins_with(SK, :sk)" \
    --expression-attribute-values file://values.json