我正在尝试使用bash中的AWS CLI删除同时具有分区和排序键的DynamoDB表中的所有项目。到目前为止,我发现的最好的事情是:
aws dynamodb scan --table-name $TABLE_NAME --attributes-to-get "$KEY" \
--query "Items[].$KEY.S" --output text | \
tr "\t" "\n" | \
xargs -t -I keyvalue aws dynamodb delete-item --table-name $TABLE_NAME \
--key "{\"$KEY\": {\"S\": \"keyvalue\"}}"
但这对于同时具有分区键和排序键的表不起作用,而且我还不能使它对这样的表起作用。知道如何修改脚本以使其适用于具有复合键的表吗?
如果您对使用Node.js感兴趣,请查看此示例(我在这里使用TypeScript)。更多相关信息可以在AWS文档中找到。
import AWS from 'aws-sdk';
const DynamoDb = new AWS.DynamoDB.DocumentClient({
region: 'eu-west-1'
});
export const getAllItemsFromTable = async TableName => {
const Res = await DynamoDb.scan({ TableName }).promise();
return Res.Items;
};
export const deleteAllItemsFromTable = async (TableName = '', items:{ id: string }, hashKey) => {
var counter = 0;
//split items into patches of 25
// 25 items is max for batchWrite
asyncForEach(split(items, 25), async (patch, i) => {
const RequestItems = {
TableName: patch.map(item => {
return {
DeleteRequest: {
Key: {
id: item.id
}
}
};
})
};
await DynamoDb.batchWrite({ RequestItems }).promise();
counter += patch.length;
console.log('counter : ', counter);
});
};
function split(arr, n) {
var res = [];
while (arr.length) {
res.push(arr.splice(0, n));
}
return res;
}
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
const tableName = "table"
// assuming table hashKey is named "id"
deleteAllItemsFromTable(tableName,getAllItemsFromTable(tableName))
更正@Cheruvian发布的内容。以下命令有效,创建架构时需要排除的字段很少。json。
aws dynamodb describe-table --table-name $table_name | jq '.Table | del(.TableId, .TableArn, .ItemCount, .TableSizeBytes, .CreationDateTime, .TableStatus, .LatestStreamArn, .LatestStreamLabel, .ProvisionedThroughput.NumberOfDecreasesToday, .ProvisionedThroughput.LastIncreaseDateTime)' > schema.json
aws dynamodb delete-table --table-name $table_name
aws dynamodb create-table --cli-input-json file://schema.json
根据表的大小,这可能会太贵,导致停机。请记住,删除的成本与写入的成本相同,因此您将受到配置的WCU的限制。只需删除并重新创建表就可以更简单、更快。
# this uses jq but basically we're just removing
# some of the json fields that describe an existing
# ddb table and are not actually part of the table schema/defintion
aws dynamodb describe-table --table-name $table_name | jq '.Table | del(.TableId, .TableArn, .ItemCount, .TableSizeBytes, .CreationDateTime, .TableStatus, .ProvisionedThroughput.NumberOfDecreasesToday)' > schema.json
# delete the table
aws dynamodb delete-table --table-name $table_name
# create table with same schema (including name and provisioned capacity)
aws dynamodb create-table --cli-input-json file://schema.json
如果您真的愿意,您可以单独删除每个项目,并且您走在正确的轨道上,您只需要在扫描投影和删除命令中指定散列和范围键。
aws dynamodb scan \
--attributes-to-get $HASH_KEY $RANGE_KEY \
--table-name $TABLE_NAME --query "Items[*]" \
# use jq to get each item on its own line
| jq --compact-output '.[]' \
# replace newlines with null terminated so
# we can tell xargs to ignore special characters
| tr '\n' '\0' \
| xargs -0 -t -I keyItem \
# use the whole item as the key to delete (dynamo keys *are* dynamo items)
aws dynamodb delete-item --table-name $TABLE_NAME --key=keyItem
如果你想得到超级花哨的,你可以使用state-table
调用来获取散列和范围键来填充$HASH_KEY
和$RANGE_KEY
,但我会把它作为一个练习留给你。
与主键、复合键和候选键相比,dynamodb中的分区键和排序键是什么?
如何使用Amazon DynamoDB模块获取仅匹配分区键(表有排序键)的所有项目。我正在使用GetItemRequest查询没有排序键。 当我仅使用分区键和GetItemRequest进行查询时,我会遇到以下错误。 <代码>原因:软件。亚马逊。awssdk。服务。发电机B。模型DynamoDbException:提供的关键字元素与架构不匹配(服务:DynamoDb,状态代码:400,请求ID:6
我试图使用batchGetItem从表中返回多个项的属性,但似乎它只适用于分区键和范围键的组合,但是如果我只想通过主键识别请求的项,该怎么办?唯一的方法是创建不带范围键的表吗? 根据官方留档: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.Partitions.html 如果表有一个复合主键(分
我有一个带有主键和排序键的表;因为这是一个复合键,所以我有多个主键与不同的排序键映射。 如何获取与特定主键关联的所有排序键? 我尝试使用“Get”操作,但这似乎也需要排序键(尽管我正在寻找这些键)。我还研究了“BatchGet”操作,但这是针对多个不同的键,而不是针对具有多个不同排序键的单个主键。 我也尝试过“查询”,但没有成功,但我对这一点了解较少,所以这可能就是解决方案——是这样吗?我还知道,
我正在为DynamoDb使用AWS(JS)文档客户端库,并试图从表(分区排序键)中执行。问题是,我想按分区键和任何排序键获取所有项。 如果我没有在中定义sort key,我会得到
我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。 这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措