Dans la demande, je peux ou ne pas avoir un champ "email".Comment mettre à jour l'attribut DynamoDB en fonction de la valeur de l'attribut précédent?
Dans mon appel de mise à jour DynamoDB, je souhaite construire une UpdateExpression de sorte qu'elle mette à jour le champ "email" en fonction de la valeur de la requête, sinon, utilisez la valeur précédente du champ.
Il met à jour correctement lorsque je mets « email » dans la demande, mais si je ne le fais pas, il met à jour juste le champ à la chaîne littérale, userProfile.email, au lieu du chemin, userProfile.email
controller.js:
async function updateUserProfile(ctx) {
if (ctx.params && ctx.params.userId) {
try {
const data = await db('update')({
TableName: TABLE_NAMES.USERS,
Key: {
userId: ctx.params.userId,
},
ExpressionAttributeValues: {
':email': ctx.request.body.email || 'userProfile.email' || null,
},
UpdateExpression:
'set userProfile.email = :email,
});
ctx.status = 200;
ctx.body = data;
} catch (error) {
ctx.throw(400, error);
}
}
}
Si mon corps demande ressemble à ceci:
{ "email": "newEmail" }
alors l'élément utilisateur mise à jour va ressembler à quelque chose comme ceci:
{ "userProfile": { "email": "newEmail" }
qui est prévu, mais si je ne comprends pas « email » dans le corps de la requête, l'article utilisateur mise à jour ressemble à ceci:
{ "userProfile": { "email": "userProfile.email" }
Il semble que le UpdateExpression prend la chaîne littéralement au lieu de le convertir en chemin. Je pourrais probablement utiliser une ConditionExpression, mais il y a d'autres champs que "email" et ils auraient aussi besoin de leur propre ConditionExpression, et je ne peux en avoir qu'un dans un appel. Comment est-ce que je lui fais voir la valeur en tant que chemin, ou est-ce qu'il y a une autre manière que je peux mettre à jour avec la valeur d'attribut précédente?