如何在没有 sql-like UpdateExpression 的情况下在 DynamoDB 中执行更新?

How to perform Update in DynamoDB without sql-like UpdateExpression?

我的应用程序中有一个非常通用的数据库实现 class。

我想向 AWS DynamoDB 更新提供两件事:iddata {...} 待更新。

但是,我在文档中只看到了以下类似 SQL 的方法:

{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ExpressionAttributeValues: {
        ":label": "Global Records"
    }
}

是否真的没有办法做到这一点更 MongoDB 风格,而不必实际编写查询?我会更深入地研究这样的事情:

{
    TableName: "Music",
    Key: {
        "id":"123-random-id"
    },
    Item: { "label": "Global Records" }
}

不幸的是,虽然这不会失败,但不会更新任何内容。

您没有解释您希望 Item: { "label": "Global Records" } 做什么:

如果要替换 整个 项,可以使用 PutItem

但是,如果您只想替换项目的 label 属性,而不触及项目的任何其他现有属性,那么您确实需要使用 UpdateItem 就像你一样。您可以像以前一样使用 UpdateExpression 语法 - 老实说,这并不难 - 但还有一种较旧的语法 AttributeUpdates 您可能更喜欢它,因为您只需要定义您需要的属性想要替换 - 无需准备“表达式”。 AttributeUpdates 语法较旧,被认为是“遗留”语法,但仍然有效,许多应用程序都在使用它,所以我怀疑它会很快消失。

我对 MongoDB 不够熟悉,无法将其查询语法与 DynamoDB 进行比较。 但是,如果我正确理解您的问题,您是在问是否有更简单的方法来使用 DynamoDB API。根据我的经验,这个问题的答案是否定的。嗯,不直接使用 AWS SDK。

社区中有多项努力旨在构建使与 Dy​​namoDB 的交互感觉更自然的工具。 DynamoDB Toolbox 就是这样一种对我来说效果很好的努力,尽管它不会使您无法理解 DynamoDB 表达式的语法。

例如,使用 DynamoDB 工具箱,您的示例代码片段可以写成:

let item = {
   id: "123-random-id",
   label: "Global Records",
}
await MyEntity.update(item)