如何根据以前的属性值更新DynamoDB属性?

时间:2017-10-19 16:17:03

标签: javascript database nosql amazon-dynamodb

在请求中,我可能有也可能没有"电子邮件"字段。

在我的DynamoDB更新调用中,我想构建一个UpdateExpression,以便更新" email"字段基于请求的值,但如果未找到,则使用字段的先前值。

当我把" email"在请求中,但如果我不这样做,它只是将字段更新为文字字符串userProfile.email,而不是路径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);
    }
  }
}

如果我的请求正文如下:

{ "email": "newEmail" }

然后更新的用户项看起来像这样:

{ "userProfile": { "email": "newEmail" }

这是有意的,但如果我不包含"电子邮件"在请求正文中,更新的用户项看起来像这样:

{ "userProfile": { "email": "userProfile.email" }

似乎UpdateExpression正在逐字地取字符串而不是将其转换为路径。我可能可以使用ConditionExpression,但还有其他字段而不是" email"而且他们也需要自己的ConditionExpression,而我只能在一个电话中有一个。

如何让它将值视为路径,还是有其他方式可以使用以前的属性值进行更新?

1 个答案:

答案 0 :(得分:1)

它为您设置EMAIL值的方式存在问题

ExpressionAttributeValues: {

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

如果您没有ctx.request.body.email的价值,那么电子邮件将设置为' userProfile.email'。要使代码生效,首先应检查ctx.request.body.email!= null,然后仅分配电子邮件值。换句话说,您需要首先动态构造expressionattributes并设置该变量。

ExpressionAttributeValues:{' expressionattributevaluevriable' }