当前位置: 首页 > 知识库问答 >
问题:

使用conditionExpression而不是key的DynamoDB更新项

燕砚文
2023-03-14

我试图通过添加一个条件来更新dynamodb中的一个项,而不在参数中传递键。一旦我的情况属实,我会立即更新。有可能做到这一点吗?

下面是一个项目的示例:

{
   "id" : "bcc2f32e-305e-4469-88e2-463724b5c6a9",
   "name" : "toto",
   "email" : "toto@titi.com"
}

其中电子邮件是唯一的项目。

测试了这段代码,它是有效的:

const name= "updateName";
const params = {
    TableName: MY_TABLE,
    Key: {
        id
    },
    UpdateExpression: 'set #name = :name',
    ExpressionAttributeNames: { '#name': 'name' },
    ExpressionAttributeValues: { ':name': name },
    ReturnValues: "ALL_NEW"
}

dynamoDb.update(params, (error, result) => {
    if (error) {
        res.status(400).json({ error: 'Could not update Item' });
    }
    res.json(result.Attributes);
})

但我想这样做(用conditionExpression替换键):

const params = {
    TableName: MY_TABLE,
    UpdateExpression: 'set #name = :name',
    ConditionExpression: '#email = :email',
    ExpressionAttributeNames: { 
        '#name': 'name',
        '#email': 'email'   
    },
    ExpressionAttributeValues: { 
        ':name': name,
        ':email': email
    },
    ReturnValues: "ALL_NEW"
}
dynamoDb.update(params, (error, result) => {
    if (error) {
        res.status(400).json({ error: 'Could not update User' });
    }
    res.json(result.Attributes);
})

但是这个代码不起作用。

有什么想法吗?

共有2个答案

农波涛
2023-03-14

键是执行更新时必需的参数;除了提供键外,还可以使用条件表达式,但不能代替键使用。

此外,我不确定您是否完全理解conditionExpression的用途——它不像SQL update语句中的“where”子句(即update mytable set name='test'where email='myemail.com')。

相反,从逻辑上讲,更新中的条件表达式更像:

更新mytable集名称='test',其中key='12345',但仅当数量

i、 e.您告诉dynamodb您想要更新的记录的确切密钥,一旦它找到它,它就会使用条件表达式来确定是否应该继续更新,即找到id=12345的记录,并将名称更改为“test”,只有数量大于0的记录。

它不使用条件表达式来查找要更新的记录。

斜高翰
2023-03-14

如果不使用整个主键(分区键和排序键(如果存在)),就不能更新DynamoDB中的项。这是因为您必须为更新指定一条记录。请参见此处的留档。

如果希望使用非主键的字段查找项目,则可以使用扫描(可能速度慢且成本高)或使用该字段上的全局二级索引(GSI)进行搜索。这两种方法中的任何一种都需要您执行单独的请求来查找有问题的项,然后使用其主键来执行更新。

听起来你想做一个等待条件的更新。DynamoDb不是这样工作的;它不能等待任何东西(我想,除了一致性,但这有点不同)。你可以做的是提出一个带有条件的请求,如果它没有满足条件(立即返回),请稍后再次提出请求。如果你这么做了,你需要小心地做出适当的让步,否则你可能会很快提出很多请求。

 类似资料:
  • 因此,我在DynamoDB中有一项: 我想添加一个新的属性到上述项目,属性是: 现在,我在JS中使用AWS-SDK这样做: 但是,我得到一个错误: ExpressionAttributeValue包含无效值:一个或多个参数值无效:AttributeValue不能包含key:newAttr的空字符串 所以如果我是这样就可以了,但我不希望这个新属性是一个字符串,我希望它是一个列表。 那么我做错了什么?

  • 问题内容: 今天,我遇到了该方法,该方法在字典中给定键,然后返回关联的值。 此功能用于什么目的?如果我想找到与字典中的键相关联的值,我可以这样做,并且它返回相同的内容: 问题答案: 如果密钥丢失,它允许您提供默认值: 返回(无论您选择的是什么),而 会提出一个。 如果省略,则为,这样 返回就像

  • 这个功能有什么用处?如果我想在字典中查找与键相关联的值,我可以执行,它返回相同的内容:

  • 我试图更新DynamoDB表中的项目。我写的代码正在更新项目,但是当我添加一个标题为“源代码/目标”的列时,它会给出一个“验证异常”异常。 用于更新的代码- 我得到的错误是- 调用UpdateItem操作时发生错误(ValidationException):无效的UpdateExpression:语法错误;标记:\“/\”,靠近:\“源/目标” 这个怎么解决?

  • 我不懂java更新。使用Windows 10,当我进入C:\Program Files\Java时,我有3个文件夹: -jdk1.8.0_221 -jre1.8.0_251 -jre1.8.0_261 当我打开cmd并键入java-version时,我得到: 当我键入javac-version时,我得到: 我检查了环境变量,它没有与Java相关的注释。当我输入cmd时,我得到: 当我键入where

  • 这看起来应该很简单,但我没有找到任何例子或留档。我有一个看起来像这样的Dynamodb表: 记录1:{姓名、电子邮件、项目[{product}、{item2}、{item3]} 记录2:(姓名、电子邮件、项目[{product}、{item2}、{item3]} 我需要能够更新items元素,即更新记录1中的item1对象。我可以通过硬编码list数组元素使用以下代码来实现这一点,但我不知道如何将