如何在DynamoDB表中的项目之间循环?

问题描述 投票:0回答:2

如何在DynamoDB表中的项目之间循环?

即,如果我有一个包含[A,B,C]的表,如何在我的第一个电话中有效地获得项目A,在我的第二个电话中有效地获得项目B,在我的第三次呼叫中有效地获得项目C,并在我的第四次调用中再次有效地获得项目A, ?

此表将来可能扩展为包括D, E, F等,我想将新元素纳入周期。

我目前的做法是为每一项赋予一个“ seen”属性。我们扫描整个表,找到一个不是“可见”的元素,然后将其放回为“可见”。当一切都“可见”后,使所有元素不再“可见”。这非常昂贵。

python-3.x database amazon-web-services amazon-dynamodb boto3
2个回答
2
投票

我认为最简单的选择可能是:

  1. 使用Limit=1进行扫描并且不提供ExclusiveStartKey,这将得到第一项
  2. [如果返回了某个项目,并且响应中存在LastEvaluatedKey,然后将ExclusiveStartKey设置为先前响应的LastEvaluatedKey,然后再次单击Limit=1,则重新运行扫描,重复步骤2直到没有任何项目返回或LastEvaluatedKey缺失
  3. 当您退回零个商品时,您已经到达表格的末尾,转到步骤1

这是一种不寻常的模式,可能不是非常有效,因此,如果您可以在此实际分享您在尝试做的事情,那么我们也许可以提出更好的选择。


0
投票

返回未被看见的项目的有效方法是在插入时包含一个seeed = no属性。然后,您可以在该属性上拥有一个全局二级索引,然后可以使用Query()。

没有一种有效的方法将所有seed = yes属性重置为no。 Scan()和Query()都将最终返回整个表,而您最终将一次一个地更新记录。一张大桌子既不快也不便宜。

编辑一旦所有记录都具有seen="yes"并且您想要将它们重置为seen="no",上面建议的GSI查询将像扫描一样工作...每条记录都必须读取然后更新。

如果您有1M条记录,每条记录约为1K,并且您想重置它们...您将需要250K读取(因为您可以使用单个4KB RCU读取4条记录)1M写

© www.soinside.com 2019 - 2024. All rights reserved.