如果该项目不存在,如何防止在UpdateItem中创建新项目 [英] How to prevent creating a new item in UpdateItem if the item does not exist

查看:43
本文介绍了如果该项目不存在,如何防止在UpdateItem中创建新项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我不希望我的方法创建尚不存在的新项目。我希望仅当记录存在时才作为更新。如果不存在,则什么也不做。我该如何实现?我希望我应该能够使用ConditionalExpression实现此目的,但是我为此所做的尝试并未成功。



当前参数的示例我发送给更新功能的信息如下。在此示例中,我想更新具有userId 123的用户,并希望将此用户的isActive字段设置为 false(但我只想在用户123实际上存在的情况下执行此操作!)

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


解决方案

您可以使用 ConditionExpression 。如果键(即userId)存在并且update属性(即isActive)不等于与您要更新的新值,则将进行更新。

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

编辑:-



这应该可行。应该是 ConditionExpression (不是ConditionalExpression)。

  var参数= {
TableName:'users',
键:{
'userId':'123'
},
UpdateExpression:'SET isActive =:isActiveVal',
ConditionExpression:'userId =:userIdVal和isActive< :isActiveVal',
ExpressionAttributeValues:{
':userIdVal':'123',
':isActiveVal':'false'
},
ReturnValues: ALL_NEW
};

更新,2020年:



您可以使用 ConditionExpression 中的 attribute_exists 来检查该项目是否存在。 (来源: 1 2

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


I am running an AWS Lambda service written in Node.js that interacts with a DynamoDB database. One of my methods performs an update (AWS.DynamoDB.DocumentClient().update) on DynamoDB to update a specific item. My problem is, however, that when I try to update an item and that item does not exist, then the update method adds this new item to my table. This behavior is the default described in the documentation too.

I do not want my method to create a new item if it does not yet exist. I want this to be an update only if the record exists. If it doesn't exist it must do nothing. How do I achieve this? I expect I should be able to use a ConditionalExpression to achieve this, but the attempts I've made at doing this have not been successful.

An example of current parameters I'm sending to the update function is given below. In this example I want to update the user that has userId 123 and I want to set the isActive field to 'false' for this user (but I only want to do this if user 123 actually exists!)

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

解决方案

You can use ConditionExpression for this. The update will happen if the key (i.e. userId) is present and update attribute (i.e. isActive) is not equal to the new value that you are trying to update.

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

EDIT:-

This should work. It should be ConditionExpression (not 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"
};

Update, 2020:

You can use attribute_exists in ConditionExpression to check if the item exists or not. (Sources: 1, 2)

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

这篇关于如果该项目不存在,如何防止在UpdateItem中创建新项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆