我最想做的是调用LogTable.DeleteItem(user_id) - 而不提供范围。
而不提供范围,并让它为我删除所有东西。
这确实是一个可以理解的要求;我可以想象像这样的高级操作可能会随着时间的推移被AWS团队添加(他们有一个历史,就是先从有限的功能集开始,然后根据客户的反馈评估扩展),但这里是你应该做的,至少可以避免全面扫描的成本。
使用
查询
而不是
扫描
来检索所有的项目,
user_id
- 这在使用哈希/范围主键的情况下都有效,因为
HashKeyValue
和
RangeKeyCondition
在这个API中是独立的参数,前者只针对
复合主键的哈希组件的属性值。
请注意,你必须像往常一样在这里处理查询API分页,见
ExclusiveStartKey
参数。
项目的主键,从这里继续先前的查询。一个较早的查询可能会提供这个值作为
先前的查询可能会提供这个值作为LastEvaluatedKey,如果该查询操作在完成之前被中断的话。
如果该查询操作在完成查询前被中断,或者由于结果集的大小或
因为结果集的大小或限制参数的原因。最后评估键
LastEvaluatedKey可以在一个新的查询请求中传回,以继续
从这一点上继续操作。
循环所有返回的项目,并像往常一样促进
DeleteItem
。
更新
:很可能
BatchWriteItem
更适合于这样的用例(详见下文)。
要上传一个项目,你可以使用PutItem API,而要删除一个
项目,你可以使用DeleteItem API。然而,当你想上传
或删除大量的数据时,例如从Amazon Elastic MapReduce上传大量的
数据或将数据从其他数据库迁移到Amazon DynamoDB时,就需要使用PutItem API。
数据库迁移到Amazon DynamoDB,这个API提供了一个有效的
替代方案。
请注意,这仍然有一些相关的限制,最明显的是。
单个请求中的最大操作
- 你可以指定总共多达25个投放或删除操作;但是,总的请求大小不能超过1MB(HTTP有效载荷)。
不是一个原子操作
--在BatchWriteItem中指定的单个操作是原子的;但是BatchWriteItem作为一个整体是一个 "尽力 "的操作,不是一个原子操作。也就是说,在一个BatchWriteItem请求中,一些操作可能会成功,而另一些可能会失败。[...]
尽管如此,这显然为像眼前这样的用例提供了潜在的巨大收益。