удалить элемент списка в DynamodB с индексом, являющимся значением, хранящимся в переменной - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь удалить элемент из списка. Выражение обновления работает, когда я жестко кодирую индекс элемента (то есть REMOVE relatedUsers [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',
    };

Но это ничего не обновляло в БД. Можете ли вы помочь мне разрешить эту ситуацию?

1 Ответ

0 голосов
/ 01 мая 2018

Фактически вы просто строите строку запроса, поэтому попробуйте использовать вместо нее литерал:

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);
        }
      });
    });
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...