gpt4 book ai didi

amazon-dynamodb - 如果项目不存在,如何防止在 UpdateItem 中创建新项目

转载 作者:行者123 更新时间:2023-12-03 08:26:24 26 4
gpt4 key购买 nike

我正在运行用 Node.js 编写的 AWS Lambda 服务,该服务与 DynamoDB 数据库交互。我的一种方法在 DynamoDB 上执行更新 (AWS.DynamoDB.DocumentClient().update) 以更新特定项目。但是,我的问题是,当我尝试更新一个项目但该项目不存在时,更新方法会将这个新项目添加到我的表中。此行为是 documentation 中描述的默认行为也。

如果尚不存在,我不希望我的方法创建新项目。我希望这仅在记录存在时才进行更新。如果它不存在,它必须什么都不做。我如何实现这一目标?我希望我应该能够使用 ConditionalExpression 来实现这一点,但是我为此所做的尝试并未成功。

下面给出了我发送给更新函数的当前参数的示例。在此示例中,我想更新 userId 为 123 的用户,并且想将此用户的 isActive 字段设置为“false”(但我只想在用户 123 实际存在的情况下执行此操作!)

const params = {
TableName: 'users',
Key: {
userId: '123',
},
ExpressionAttributeValues: {
':isActive': 'false'
},
UpdateExpression: 'SET isActive = :isActive',
ReturnValues: 'ALL_NEW',
};

最佳答案

您可以使用 ConditionExpression为了这。如果存在 key (即 userId)并且更新属性(即 isActive) ,则会发生更新不等于 到您尝试更新的新值。

ConditionExpression: "userId = :userIdVal and isActive <> :isActiveVal",
ExpressionAttributeValues: {
':isActive': 'false',
':userIdVal': '123'
},

编辑:-

这应该有效。应该是 ConditionExpression (不是条件表达式)。

var params = {
TableName: 'users',
Key: {
'userId': '123'
},
UpdateExpression: 'SET isActive = :isActiveVal',
ConditionExpression: 'userId = :userIdVal and isActive <> :isActiveVal',
ExpressionAttributeValues: {
':userIdVal': '123',
':isActiveVal': 'false'
},
ReturnValues: "ALL_NEW"
};

2020 年更新:

您可以使用 attribute_existsConditionExpression检查项目是否存在。 (来源: 12)

const params = {
TableName: 'users',
Key: {
'userId': '123'
},
UpdateExpression: 'SET isActive = :isActiveVal',
ConditionExpression: 'attribute_exists(userId)',
ExpressionAttributeValues: {
':isActiveVal': 'false'
},
ReturnValues: "ALL_NEW"
};

关于amazon-dynamodb - 如果项目不存在,如何防止在 UpdateItem 中创建新项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41873769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com