удалить элемент списка в DynamodB с индексом, являющимся значением, хранящимся в переменной

1

Я пытаюсь удалить элемент из списка. Выражение update работает, когда я жестко кодирую индекс элемента (т.е. УДАЛЯЮЩИЕ связанные с ним [0]), но у меня есть индекс, найденный в переменной. Поэтому я попытался использовать ExpressionAttributeValues, чтобы заменить переменную в выражении обновления, но получаю сообщение об ошибке "Invalid UpdateExpression: Синтаксическая ошибка; токен:\": userIndex \", рядом:\"[: 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. Можете ли вы помочь мне решить эту ситуацию?

Теги:
list
aws-lambda
amazon-dynamodb

1 ответ

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);
        }
      });
    });
  }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню