2017-10-19 41 views
0

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?

Répondre

1

Son problème avec la façon dont vous définissez la valeur pour EMAIL

ExpressionAttributeValues: { 

':email': ctx.request.body.email || 'userProfile.email' || null, 
} 

lorsque vous n'avez pas la valeur pour ctx.request.body.email, puis e-mail est à « userProfile.email ». Pour que le code fonctionne, vous devez d'abord vérifier si ctx.request.body.email! = Null, puis n'attribuer que la valeur email. En d'autres termes, vous devez d'abord construire dynamiquement les attributs d'expression et définir cette variable.

ExpressionAttributeValues: {'expressionattributevaluevriable'}