如何创建或更新相同的 DynamoDb 项目?



我正在使用节点aws-sdk,我已经实现了一种在DynamoDb中创建或更新项目的方法。

它基于密钥 (Id( 运行良好,并且将创建或更新项目。

我的参数如下:

let params = {
TableName: TableName,
Key: {
key: args.key
},
UpdateExpression: `set 
userKey = :userKey,
content = :content`,
ExpressionAttributeValues: {
':userKey': args.userKey,
':content': args.content
},
ExpressionAttributeNames: { 
}
};

从那以后,我意识到我需要有条件地检查更新中的辅助密钥,以确保用户密钥匹配。

所以我补充说:

ConditionExpression: 'userKey = :userKey',

现在创建不起作用,因为它不符合条件,在一个语句中进行创建和条件更新的正确方法是什么?

我的表定义如下:

AttributeDefinitions:
- AttributeName: key
AttributeType: S
- AttributeName: userKey
AttributeType: S
- AttributeName: timestamp
AttributeType: N
KeySchema:
- AttributeName: key
KeyType: HASH

你有两个选择-

如果您userKey实际上是表的排序键 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html(,那么您可以更改参数如下:

Key: {
key: args.key
userKey: args.userKey
}

但是,如果userKey只是另一个属性,则可以按如下方式扩展条件表达式:

ConditionExpression: 'userKey = :userKey OR attribute_not_exists(userKey)'

这将要求userKey匹配您的期望,或者根本没有设置(在更新器上就是这种情况(。

注意 -这将允许您使用没有userKeykey更新项目。如果您担心这一点,则可以将条件扩展到:

ConditionExpression: 'userKey = :userKey OR(attribute_not_exists(key) AND attribute_not_exists(userKey))'

最新更新