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
要修改某个项目,DynamoDB 内部需要读取整个项目,对其进行修改并将其写回磁盘,因此您需要为整个项目付费,而不是为修改的一小部分付费。
\n\n此外,DynamoDB 写入比读取昂贵得多,并且它们的价格已经包括所涉及的(强一致)读取:如果您有条件表达式或任何 ReturnValues 选项,则无需支付额外费用(但请注意,即使条件表达式导致写入未完成,您仍然需要付费)。
\n\n以下是官方文档中的一些相关引用:
\n\nhttps://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html
\n\n\n\n\n\n\nUpdateItem\xe2\x80\x94修改表中的单个项目。DynamoDB 会考虑更新前后项目的大小。消耗的预配置吞吐量反映了这些项目大小中较大的一个。即使您仅更新项目属性的子集,UpdateItem 仍将消耗全部预配吞吐量(“之前”和“之后”项目大小中的较大者)。
\n
\n\n除了较小的网络和接收较大响应的处理开销之外,不存在与请求返回值相关的额外成本。不消耗任何读取容量单位。
\n
| 归档时间: |
|
| 查看次数: |
2033 次 |
| 最近记录: |