Я пытаюсь удалить элемент из списка. Выражение 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. Можете ли вы помочь мне решить эту ситуацию?
Фактически вы просто строите строку запроса, поэтому попробуйте вместо этого использовать литерал:
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);
}
});
});
}