如何使用Dynamo的单个UpdateExpression进行SET和DELETE

时间:2017-05-17 10:41:14

标签: node.js amazon-dynamodb

我正在尝试使用updateExpression更新项目,并且我想编辑属性并删除同一对象上的另一个属性,但是我收到以下错误:

  

无效的UpdateExpression:语法错误;令牌:EOF附近:“attributeToDelete”

我必须承认我写了更新表达式,猜测使用它的正确方法(失败)。这是代码片段:

dynamodb.updateAsync({
    TableName: `myTable`,
    Key: { id: req.params.id },
    UpdateExpression: 'SET attributeToEdit = :newValue DELETE attributeToDelete',
    ExpressionAttributeValues: { ':newValue': 'valueToSet' },
  })

当我想要包含多个动作时,我应该如何编写UpdateExpression? (其中的操作是 - > SET,DELETE,REMOVE,ADD)

2 个答案:

答案 0 :(得分:15)

使用DELETE而不是DELETE。 UpdateExpression: 'SET attributeToEdit = :newValue REMOVE attributeToDelete', 用于从SET中删除元素。

"aoColumnDefs":[
    {
        "mData": null,
        "bSortable": false, 
        "bSearchable": false,
        "fnRender": function (oObj) {
            return '<img src="/Content/images/details_open.png" alt="expand/collapse" rel="' + oObj.aData[0] + '" />';
        }
    },
    { "mData": 0 },
    { "mData": 1 },
    { "mData": 2 },
    { "mData": 3 }
]
  

删除 - 从项目中删除一个或多个属性。

答案 1 :(得分:0)

我在这方面挣扎了很长时间,所以我想第二个例子可能对未来的搜索者有所帮助。这个例子使用CakePHP,Marshal JSON,SET和ADD,并包含变量以显示几种不同的方法来获得你想要的东西。你显然也会传入调用它的整个函数中的所有变量。

    $key = $this->marshaler->marshalJson('
        {
            "field_one": ' . $variableOne . '
        }
    ');

    if ($criteriaOne === null) {
        $add = $this->marshaler->marshalJson('
            {"0":{
                "field_two": ' . $variableTwo . ',
                "field_three": "' . $variableThree . '"
            }}
        ');
    } else {
        $add = $this->marshaler->marshalJson('
            {"0":{
                "field_two": ' . $variableTwo . ',
                "field_three": "' . $variableThree . '"
                "field_four": "null"
            }}
        ');
    }

    $eav = [
        ":vals" => [
            "L" => [$add[0]]
        ],
        ":vals1" => [
            "NS" => ["$variableTwo"]
        ]
    ];

    $ean = [
        "#co" => "column_one",
        "#ct" => "column_two"
    ];

    return [
        'TableName' => 'Dynamo_Table_Name',
        'Key' => $key,
        'UpdateExpression' =>
            'SET #co = list_append(:vals, #co) ADD #ct :vals1',
        'ExpressionAttributeNames' => $ean,
        'ExpressionAttributeValues' => $eav,
        'ReturnValues' => 'ALL_NEW'
    ];