DynamoDb:用于更新数组的 UpdateExpression

DynamoDb: UpdateExpression for updating arrays

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

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

情况:我有一个 table,其中有一个名为 users 的字段。 Users 是可以更新的 uuids 的数组。 table中的项目示例:

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

我想用用户 uuid 更新用户数组。对于我的更新功能,我通过:

{ users: ['13245395'] }

更新函数(数据为{ users: ['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 会附加到与第一个相同的字符串,因此它看起来像 ['123,456' ] 而不是 ['123', '456'].

    UpdateExpression: "set users = :users", 表达式属性值:{ “:用户”:[${data.users}] },

  2. 使用“L”和“S”数据类型判断为字符串数组,即

    UpdateExpression: "set users = :users", 表达式属性值:{ “:用户”:{“L”:{“S”:${data.users}}} },

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

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

尝试

":users": data.users

这会将 users 设置为 data.users

中的数组