无法使用nodejs在Dynamodb上使用updateExpression进行更新

cant update using updateExpression on Dynamodb using nodejs

这是我的数据结构-

{
      "pk": "USER-12560000000",
      "sk": "USER",
      "data": {
        "name": "George",  //I want to modify the value of this attribute
        "updatedAt": Date.now()  // I want to add this attribute to the data field
      }
}

我一直在 updateExpression 下面尝试这个,但出于某种原因,它甚至没有给出 cloudwatch 中错误的线索。在下面的代码中,我只是想更新 displayName 属性的值,不确定如何添加额外属性的代码。 cloudwatch 日志也不打印错误原因。我已经阅读了关于 aws 的文档以及其他一些 stackoveflow 帖子。我没能完成这项工作。

主要 Lambda 处理程序 -

const updateUser = require('./user-queries/updateUser');
exports.handler = async (event) => {
  var userId = event.arguments.userId;
  var name = event.arguments.name;
  var avatarUrl = event.arguments.avatarUrl;
 console.log(event.info.fieldName);
  switch(event.info.fieldName) {
      case "updateUser":
          return updateUser(userId, name, avatarUrl);
  }
};

const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()

async function updateUser(userId, name, avatarUrl) {
  dynamoDB
    .update({
      TableName: "Bol-Table",
      Key: {
        pk: "USER-12560000000",
        sk: "USER",
      },
      UpdateExpression: `set data = :data`,
      ExpressionAttributeValues: {
        ":data": {
          "name": "Test"
        },
      },
    })
    .promise()
    .then(data => console.log(data.Attributes))
    .catch(console.error)
}
module.exports = updateUser;

这是在 cloudwatch 中打印出来的内容以及一些账单信息 2021-10-09T16:25:15.527Z b1a1e4cb-6001-415c-82a3-cfdc90413e4e INFO USER-12560000000 Sam www.bol.com

你的UpdateExpressionExpressionAttributeValues是错误的,它们应该是:

UpdateExpression: `set data.name = :x`
...
ExpressionAttributeValues: {
    ":x": "Test"
}

Key 对象还将键作为 string 接受,因此您的 Key 对象需要看起来像:

Key: {
    "pk": "USER-12560000000",
    "sk": "USER"
}

对于 update/insert 多个字段,以下将起作用:

UpdateExpression: `set data.name = :x, data.updatedAt = :y`
...
ExpressionAttributeValues: {
    ":x": "Test",
    ":y": Date.now()
}

像下面这样更改 dynamodb.update 最终一切正常。

await dynamoDB.update(params).promise();

这里是所有遇到此问题的人的完整代码。

const AWS = require("aws-sdk")
AWS.config.update({ region: "ca-central-1" })
const dynamoDB = new AWS.DynamoDB.DocumentClient()

async function updateUser(userId, name, avatarUrl) {
  var params = {
    TableName: "Bol-Table",
    Key: {
      "pk": userId,
      "sk": 'USER',
    },
    UpdateExpression: 'SET details.displayName = :name, details.avatarUrl = :avatarUrl, details.updatedAt = :updateDate',
    ExpressionAttributeValues: {
      ':name': name,
      ':avatarUrl':avatarUrl,
      ':updateDate': new Date().toISOString()
    },

    ReturnValues: 'ALL_NEW'
  };
  const Item = await dynamoDB.update(params).promise();
  console.log(Item)
}
module.exports = updateUser;