更新表中的项目时,DynamoDB 如何消耗容量?

Yi-*_*ang 3 api amazon-web-services node.js amazon-dynamodb

最近我正在使用 DynamoDB 构建一些 API。

在一个名为planet的表中,有一个属性是List of Maps(Array of Objects)的形式。基本上,属性看起来像这样。我将其称为buildingMap,因为它是许多建筑物的地图。

[
  {
    id: 'some id',
    status: 'processing',
    ...
  },
  {
    id: 'other id',
    status: 'done',
    ...
  }
]
Run Code Online (Sandbox Code Playgroud)

事情是,最初,我指出索引并直接更新数组中的该对象,就像使用这种 UpdateExpression 一样。

REMOVE buildingMap[2]

或像这样的 UpdateExpression

SET buildingMap[0].#status = :status

我认为这将使 DynamoDB 消耗的容量比我取出整个buildingMap,重写它,然后将整个buildingMap放回去要少

像这样

// Get the item using DynamoDB.DocumentClient
const planet = await docClient.get({
  TableName: 'Planet',
  Key: { planetId: 'xxxxx' }
}).promise()

// Modify the buildingMap attribute
let buildingMap = planet.Item.buildingMap
buildingMap.splice(0, 1) // remove the first object in the buildingMap

// Write back the update
await docClient.update({
   TableName: 'Planet',
   Key: { planetId: 'xxxxx' },
   UpdateExpression: 'SET buildingMap = :map',
   ExpressionAttributeValues: { ':map': buildingMap }
}).promise()
Run Code Online (Sandbox Code Playgroud)

但是,我打印了两种方法的ConsumedCapacity,结果完全一样!

有人可以帮我回答 DynamoDB在更新表中的项目时如何真正计算写入容量读取容量吗?

我的意思是,如果我只更新列表中的单个地图,为什么它消耗的容量与覆盖整个地图列表相同?

另外,当我选择返回ALL_NEW更新时,它仍然消耗与我选择返回时相同的容量UPDATED_NEW。但我认为选择返回会比?ALL_NEW消耗更多的读取容量。UPDATED_NEW

Nad*_*'El 5

要修改某个项目,DynamoDB 内部需要读取整个项目,对其进行修改并将其写回磁盘,因此您需要为整个项目付费,而不是为修改的一小部分付费。

\n\n

此外,DynamoDB 写入比读取昂贵得多,并且它们的价格已经包括所涉及的(强一致)读取:如果您有条件表达式或任何 ReturnValues 选项,则无需支付额外费用(但请注意,即使条件表达式导致写入未完成,您仍然需要付费)。

\n\n

以下是官方文档中的一些相关引用:

\n\n

https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

\n\n
\n

UpdateItem\xe2\x80\x94修改表中的单个项目。DynamoDB 会考虑更新前后项目的大小。消耗的预配置吞吐量反映了这些项目大小中较大的一个。即使您仅更新项目属性的子集,UpdateItem 仍将消耗全部预配吞吐量(“之前”和“之后”项目大小中的较大者)。

\n
\n\n

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#DDB-UpdateItem-request-ReturnValues

\n\n
\n

除了较小的网络和接收较大响应的处理开销之外,不存在与请求返回值相关的额外成本。不消耗任何读取容量单位。

\n
\n