DynamoDb:UpdateExpression,用于更新数组

时间:2018-10-29 12:49:42

标签: arrays node.js amazon-dynamodb aws-sdk-nodejs dynamodb-queries

Env:使用aws-sdk与DynamoDb交互的NodeJS服务。

问题:当我将项目的属性设置为数组时,它会另存为字符串。我期望x:['1'],但我得到x:'1'。我相信这是因为我写的UpdateExpression / ExpressionAttributeValues错误。

情况:我有一个表,其中有一个名为“用户”的字段。用户是一组可以更新的uuid。表格中项目的示例:

{ x_name: 'Hello',
  owner: '123456',
  x_uuid: '1357911',
  users: [] 
}

我想用用户uuid更新用户数组。我通过以下更新功能:

{ users: ['13245395'] }

更新功能(数据为{用户:['13245395']}):

updateX(data, { x_uuid }) {
    if (!x_uuid) {
      throw new Error('No x_uuid supplied')
    }

    // new doc client
    const docClient = new AWS.DynamoDB.DocumentClient();

    var params = {
      TableName: this.table,
      Key: {
        'x_uuid': x_uuid
      },
      UpdateExpression: "set users = :users",
      ExpressionAttributeValues:{
          ":users": `${data.users}`
      },
      ReturnValues:"ALL_NEW"
    };

    return new Promise((resolve, reject) =>
      docClient.update(params, (error, x) => {
        return error ? reject(error) : resolve(x)
      })
    )
   }
}

我得到的结果是

{ x_name: 'Hello',
  owner: '123456',
  x_uuid: '1357911',
  users: '13245395'
}

但是我期望的是:

{ x_name: 'Hello',
  owner: '123456',
  x_uuid: '1357911',
  users: ['13245395']
}

以前尝试过: 1)在创建参数时将data.users包装在数组中(适用于第一个id,但添加的第二个id与第一个id附加在相同的字符串后,因此看起来像['123,456']而不是['123','456' ]。

UpdateExpression: "set users = :users",
ExpressionAttributeValues:{
 ":users": [`${data.users`]
},

2)使用“ L”和“ S”数据类型确定它是字符串数组,即

UpdateExpression: "set users = :users",
ExpressionAttributeValues:{
 ":users": { "L": { "S":`${data.users}` } }
},

1 个答案:

答案 0 :(得分:1)

您正在将用户数组转换为字符串

":users": `${data.users}`

尝试

":users": data.users

这会将users设置为data.users中的数组