当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如果项目不存在,如何防止在UpdateItem中创建新项目》经验,为你挑选了2个好方法。

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

我不希望我的方法创建一个新项目,如果它尚不存在.我希望这只是在记录存在时才更新.如果它不存在,它必须什么都不做.我该如何实现这一目标?我希望我能够使用ConditionalExpression来实现这一目标,但我在这方面所做的尝试并没有成功.

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

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

notionquest.. 27

你可以用ConditionExpression它.如果密钥(即userId)存在且更新属性(即isActive)不等于您尝试更新的新值,则会发生更新.

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

编辑:-

这应该工作.它应该是ConditionExpression(不是ConditionalExpression).

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"
};


Gabriel Bleu.. 24

ConditionExpression是要走的路,但你也可以使用这个attribute_exists函数:

ConditionExpression: 'attribute_exists(userId)'

它只会使用正确的密钥更新行,并且ConditionalCheckFailedException如果请求的密钥不存在则抛出.

目标更明显,您可以跳过额外的userId绑定.

参考:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html



1> notionquest..:

你可以用ConditionExpression它.如果密钥(即userId)存在且更新属性(即isActive)不等于您尝试更新的新值,则会发生更新.

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

编辑:-

这应该工作.它应该是ConditionExpression(不是ConditionalExpression).

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"
};



2> Gabriel Bleu..:

ConditionExpression是要走的路,但你也可以使用这个attribute_exists函数:

ConditionExpression: 'attribute_exists(userId)'

它只会使用正确的密钥更新行,并且ConditionalCheckFailedException如果请求的密钥不存在则抛出.

目标更明显,您可以跳过额外的userId绑定.

参考:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有