有没有更简洁的方法来编写 DynamoDB 更新参数?

Is there a less verbose way to write DynamoDB update params?

我是 Dynamo 的新手,我使用无服务器框架和 TypeScript 创建了一个 simple todo API

要更新项目,我必须做这个巨大的 params const

const params = {
  TableName: process.env.DYNAMO_TABLE_TODO,
  Key: {
    id: event.pathParameters.id,
  },
  ExpressionAttributeNames: {
    "#todo_text": "text",
  },
  ExpressionAttributeValues: {
    ":text": data.text,
    ":checked": data.checked,
    ":updatedAt": timestamp,
  },
  UpdateExpression: "SET #todo_text = :text, checked = :checked, updatedAt = :updatedAt",
  ReturnValues: "ALL_NEW",
}

// update the todo in the database
dynamoDb.update(params, (error, result) => {
  if (error) throw error

  callback(null, {
    statusCode: 200,
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(result.Attributes),
  })
})

有没有更简洁的方法来做到这一点?使用 Mongoose 我会简单地做

Model.findOneAndUpdate({{ _id: id }, {
  text: data.text,
  checked: data.checked,
  updatedAt: timestamp
})

这不仅仅是关于代码是否丑陋,如果我想将 属性 A2 写入数据库,只有当 A1 存在于 Mongoose 中时,我可以从第二个中删除 属性对象,而在 Dynamo 中我将不得不编写不同的 ExpressionAttributeValuesUpdateExpression 添加更多我或其他开发人员出错的概率

由于您指的是抽象的 Mongoose,因此通过提供类似的抽象来回答问题才公平。

有一个受 mongoose 启发的建模工具,它应该可以满足您的要求。 https://github.com/dynamoose/dynamoose

这将允许您执行以下操作:

await User.update({"id": 1, "name": "Bob"}); // This code will set `name` to Bob for the user where `id` = 1

来自 https://dynamoosejs.com/guide/Model#modelupdatekey-updateobj-settings-callback