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

Amazon dynamodb 如果项目不存在,如何防止在UpdateItem中创建新项目,amazon-dynamodb,Amazon Dynamodb,我正在运行一个用Node.js编写的AWS Lambda服务,该服务与DynamoDB数据库交互。我的一个方法在DynamoDB上执行更新(AWS.DynamoDB.DocumentClient().update),以更新特定项。但是,我的问题是,当我尝试更新一个项而该项不存在时,update方法会将这个新项添加到我的表中。此行为是中描述的默认行为 如果新项尚不存在,我不希望我的方法创建新项。我想这是一个更新,只有当记录存在。如果它不存在,它就什么也不能做。我如何做到这一点?我想我应该能够使用C

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

如果新项尚不存在,我不希望我的方法创建新项。我想这是一个更新,只有当记录存在。如果它不存在,它就什么也不能做。我如何做到这一点?我想我应该能够使用ConditionalPression来实现这一点,但我在这方面所做的尝试并没有成功

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


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

ConditionExpression:“userId=:userIdVal和isActive:isactiveeval”,
表达式属性值:{
“:isActive':“false”,
“:userIdVal”:“123”
},
编辑:-

这应该行得通。它应该是条件表达式(而不是条件表达式)。

var参数={
TableName:'用户',
关键:{
“userId”:“123”
},
UpdateExpression:'SET isActive=:isactiveeval',
条件表达式:“userId=:userIdVal和isActive:isactiveeval”,
表达式属性值:{
':userIdVal':'123',
“:isActiveVal”:“false”
},
返回值:“全新”
};
更新,2020年:

您可以使用
ConditionExpression
中的
attribute\u exists
检查项目是否存在。(来源:,)

const参数={
TableName:'用户',
关键:{
“userId”:“123”
},
UpdateExpression:'SET isActive=:isactiveeval',
ConditionExpression:'attribute_exists(userId)',
表达式属性值:{
“:isActiveVal”:“false”
},
返回值:“全新”
};

条件表达式是一种方法,但您也可以使用
属性\u exists
函数:

ConditionExpression: 'attribute_exists(userId)'
它只会使用正确的键更新行,如果请求的键不存在,它会抛出一个
条件checkfailedexception

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


ref:

我在使用
属性时遇到了一个类似的问题,唯一的区别是,我需要从表中查询并只获取具有所需属性的记录。使用
ConditionExpression
对我不起作用。想在这里分享,以防有人需要

这里,如果
subscriberKey
等于给定的参数,并且
属性_在记录中存在(mobileNumber),则返回
true
false

var参数={
TableName:table_name,
IndexName:“subsciberKey索引”,
KeyConditionExpression:“subscriberKey=:subscriberKey”,
FilterExpression:“属性_存在(mobileNumber)”,
表达式属性值:{
“:subscriberKey”:subscriberNo
}

};这是我实际尝试过的选项之一。执行此操作时,会出现一个异常,ExpressionAttributeValues中提供的ValidationException:Value未在expressions:keys:{:userIdVal}中使用。看起来您没有在表达式中提供userIdVal。您是否在ConditionExpression中包含了“userId=:userIdVal”这一部分?确实包含了,并检查了拼写和语法。您能否提供完整的参数?我会看一看。编辑后编写的代码确实有效。看起来最大的问题是,我们的表达式属性值应该与表中的属性具有明显不同的名称。因此,如果table属性被称为isActive,则不应将ExpressionAttributeValue设置为:isActive(但如果将其更改为:isactiveeval,则它可以工作)。如果有人想知道相反的情况:“如果键不存在,我如何使用UpdateItem创建新项?”,则只需使用OP发布的didn不适用于我,它仍然会在updateItem上添加一个新项call@SaileshKotha它仅在我使用未被
update\u item
Key
参数修改的密钥时对我有效。
ConditionExpression: 'attribute_exists(userId)'