cod*_*ons 5 delete-operator amazon-dynamodb
我有这样的DynamoDB表结构
A B C D
1 id1 foo hi
1 id2 var hello
Run Code Online (Sandbox Code Playgroud)
A是分区键,B是排序键。
假设我只有分区键,不知道排序键,我想删除所有具有相同分区键的条目。
因此,我正在考虑通过查询以固定大小(例如1000)加载条目,并批量删除它们,直到DynamoDB中不再有带有分区键的条目为止。
是否可以删除条目而不先加载它们?
And*_*per 10
否,但您可以查询分区的所有项目,然后为每个项目发出单独的 DeleteRequest,您可以在最多 25 个项目的多个 BatchWrite 调用中进行批处理。
JS代码
async function deleteItems(tableName, partitionId ) {
const queryParams = {
TableName: tableName,
KeyConditionExpression: 'partitionId = :partitionId',
ExpressionAttributeValues: { ':partitionId': partitionId } ,
};
const queryResults = await docClient.query(queryParams).promise()
if (queryResults.Items && queryResults.Items.length > 0) {
const batchCalls = chunks(queryResults.Items, 25).map( async (chunk) => {
const deleteRequests = chunk.map( item => {
return {
DeleteRequest : {
Key : {
'partitionId' : item.partitionId,
'sortId' : item.sortId,
}
}
}
})
const batchWriteParams = {
RequestItems : {
[tableName] : deleteRequests
}
}
await docClient.batchWrite(batchWriteParams).promise()
})
await Promise.all(batchCalls)
}
}
// https://stackoverflow.com/a/37826698/3221253
function chunks(inputArray, perChunk) {
return inputArray.reduce((all,one,i) => {
const ch = Math.floor(i/perChunk);
all[ch] = [].concat((all[ch]||[]),one);
return all
}, [])
}
Run Code Online (Sandbox Code Playgroud)
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html
通过主键删除表中的单个项目。
对于主键,您必须提供所有属性。例如,使用简单的主键,您只需为分区键提供一个值。对于复合主键,必须同时提供分区键和排序键的值。
为了删除项目,您必须提供整个主键(分区+排序键)。因此,在您的情况下,您需要查询分区键,获取所有主键,然后使用这些主键删除每个项目。您也可以使用BatchWriteItem
https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html
BatchWriteItem操作在一个或多个表中放置或删除多个项目。一次调用BatchWriteItem最多可以写入16 MB的数据,其中可以包含多达25个放置或删除请求。要写入的单个项目最大可以为400 KB。
DeleteRequest-对指定项目执行DeleteItem操作。要删除的项目由一个Key子元素标识:Key-唯一标识该项目的主键属性值的映射。该映射中的每个条目均包含一个属性名称和一个属性值。对于每个主键,您必须提供所有键属性。例如,使用简单的主键,您只需为分区键提供一个值。对于复合主键,您必须同时提供分区键和排序键的值。
| 归档时间: |
|
| 查看次数: |
3439 次 |
| 最近记录: |