如何在DynamoDB表中的项目之间循环?
即,如果我有一个包含[A,B,C]
的表,如何在我的第一个电话中有效地获得项目A,在我的第二个电话中有效地获得项目B,在我的第三次呼叫中有效地获得项目C,并在我的第四次调用中再次有效地获得项目A, ?
此表将来可能扩展为包括D, E, F
等,我想将新元素纳入周期。
我目前的做法是为每一项赋予一个“ seen”属性。我们扫描整个表,找到一个不是“可见”的元素,然后将其放回为“可见”。当一切都“可见”后,使所有元素不再“可见”。这非常昂贵。
我认为最简单的选择可能是:
Limit=1
进行扫描并且不提供ExclusiveStartKey
,这将得到第一项LastEvaluatedKey
,然后将ExclusiveStartKey
设置为先前响应的LastEvaluatedKey
,然后再次单击Limit=1
,则重新运行扫描,重复步骤2直到没有任何项目返回或LastEvaluatedKey
缺失这是一种不寻常的模式,可能不是非常有效,因此,如果您可以在此实际分享您在尝试做的事情,那么我们也许可以提出更好的选择。
返回未被看见的项目的有效方法是在插入时包含一个seeed = no属性。然后,您可以在该属性上拥有一个全局二级索引,然后可以使用Query()。
没有一种有效的方法将所有seed = yes属性重置为no。 Scan()和Query()都将最终返回整个表,而您最终将一次一个地更新记录。一张大桌子既不快也不便宜。
编辑一旦所有记录都具有seen="yes"
并且您想要将它们重置为seen="no"
,上面建议的GSI查询将像扫描一样工作...每条记录都必须读取然后更新。
如果您有1M条记录,每条记录约为1K,并且您想重置它们...您将需要250K读取(因为您可以使用单个4KB RCU读取4条记录)1M写