删除dynamodb中的列表元素,索引是存储在变量中的值

时间:2018-05-01 06:26:52

标签: javascript list aws-lambda amazon-dynamodb

我试图从列表中删除某个项目。更新表达式在我对项目的索引进行硬编码时起作用(即REMOVE relatedUsers [0]),但我在变量中找到了索引。所以我尝试使用ExpressionAttributeValues替换更新表达式中的变量,但我收到错误'无效的UpdateExpression:语法错误; token:\":userIndex \",near:\" [:userIndex] \"'

这是我的代码



function updateUser(data) {
    console.log('---------updateUser---------');
    console.log(data);
    const params = {
      TableName: process.env.USER_TABLE,
      Key: {
        id: data.id,
      },
      ExpressionAttributeValues: {
        ':updatedAt': timestamp,
        ':notificationCount':1,
        ':userIndex':data.index,
      },
      UpdateExpression: 'ADD notificationCount :notificationCount REMOVE relatedUsers[:userIndex] SET updatedAt= :updatedAt ',
      ReturnValues: 'ALL_NEW',
    };

    return new Promise((resolve, reject)=>{
      dynamodb.update(params, (error,data) => {
        // handle potential errors
        if (error) {
          reject(error);
        }
        else {
          console.log("update consultant response");
          console.log(data);
          resolve(data);
        }
      });
    });
  }




我也尝试过ExpressionAttributeNames



function updateUser(data) {
    console.log('---------updateUser---------');
    console.log(data);
    let relatedUser = 'relatedUsers[' + data.index + ']'
    const params = {
      TableName: process.env.USER_TABLE,
      Key: {
        id: data.id,
      },
      ExpressionAttributeNames: {
          '#user':relatedUser
      },
      ExpressionAttributeValues: {
        ':updatedAt': timestamp,
        ':notificationCount':1,
      },
      UpdateExpression: 'ADD notificationCount :notificationCount REMOVE #user  SET updatedAt= :updatedAt ',
      ReturnValues: 'ALL_NEW',
    };




但它没有更新db中的任何内容。 你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

实际上,您只是构建一个查询字符串,因此请尝试使用文字:

function updateUser(data) {
    console.log('---------updateUser---------');
    console.log(data);
    const params = {
      TableName: process.env.USER_TABLE,
      Key: {
        id: data.id,
      },
      ExpressionAttributeValues: {
        ':updatedAt': timestamp,
        ':notificationCount':1
      },
      UpdateExpression: "ADD notificationCount :notificationCount REMOVE relatedUsers[" + data.index + "] SET updatedAt= :updatedAt",
      ReturnValues: 'ALL_NEW',
    };

    return new Promise((resolve, reject)=>{
      dynamodb.update(params, (error,data) => {
        // handle potential errors
        if (error) {
          reject(error);
        }
        else {
          console.log("update consultant response");
          console.log(data);
          resolve(data);
        }
      });
    });
  }