从DynamoDB中删除具有相同分区键的大数据

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)


F_S*_*O_K 5

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html

DeleteItem

通过主键删除表中的单个项目。

对于主键,您必须提供所有属性。例如,使用简单的主键,您只需为分区键提供一个值。对于复合主键,必须同时提供分区键和排序键的值。

为了删除项目,您必须提供整个主键(分区+排序键)。因此,在您的情况下,您需要查询分区键,获取所有主键,然后使用这些主键删除每个项目。您也可以使用BatchWriteItem

https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

BatchWriteItem

BatchWriteItem操作在一个或多个表中放置或删除多个项目。一次调用BatchWriteItem最多可以写入16 MB的数据,其中可以包含多达25个放置或删除请求。要写入的单个项目最大可以为400 KB。

DeleteRequest-对指定项目执行DeleteItem操作。要删除的项目由一个Key子元素标识:Key-唯一标识该项目的主键属性值的映射。该映射中的每个条目均包含一个属性名称和一个属性值。对于每个主键,您必须提供所有键属性。例如,使用简单的主键,您只需为分区键提供一个值。对于复合主键,您必须同时提供分区键和排序键的值

  • 所以答案是否定的。对于复合主键-无法仅使用哈希键(分区)删除项目 (9认同)