2013-07-05 51 views
14

是否有任何方式从dynamodb表获取最后N条记录?我有的范围键是时间戳。所以我可以使用ScanIndex forward来按时间顺序排列项目。获取DynamoDB表中的最后N条记录

但为了查询我需要有一个hashKey条件,我不想过滤。有什么想法吗?

回答

12

DynamoDB不是为这种方式而设计的。这些项目根据HashKey上的散列进行分配,使得订单不可预测。

选项包括:

  • 分组在一个单一的哈希键的项目(不建议:你会过载几台服务器与数据,而亚马逊也不能保证你的读/写能力)
  • 扫描整个表格并保留N个最近的项目(如for (item in items) { if (item newer then oldest accumulated item) accumulate item; });
  • 你的表分割成多个表(即,而不是表称为Events,创造一个为今天的事件,Events20130706称为Events20130705为明天的活动),并扫描就像前面的选项 - 这样一来你的扫描较小

您也可以更改您的数据模型。例如,您可以有一个版本为的条目,该条目将保持对最近N个项目的引用。或者你可以有一个单独的计数器,你可以增加和更新N个其他项,比如recent-K其中K是你的计数器模N. N

也许你甚至可以使用其他工具来完成这项工作。例如,您可以让Redis服务器执行此操作。如果没有更详细地了解您的用例,就很难提出明确的建议 - 这应该如何扩展?它应该如何可靠?你愿意执行多少维护?你愿意为此付多少钱?

接受限制通常会更好,知道你的约束和创意。

+0

谢谢。我知道这件事,但值得一试! –

+1

看起来像这个答案,从2013年,只是得到了一个downvote。任何具体原因?我在这个问题的背景下重新阅读了它,它似乎仍然适用(基本上唯一的区别是,在2.5年之后,2015年12月,DynamoDB将哈希和范围重命名为分区和排序键,但它们在概念上是等同的并保留他们原来的名字在API中) –

1

我不确定这仍然是相关的。我相当肯定你可以使用ScanIndexForward和rangeKey来获取最新值。

+2

这不会工作,不幸的是:( 原因是ScanIndexForward是查询API的参数,它需要你设置一个HashKey的EQ比较,这正是OP想要的这意味着OP需要知道最近使用的最近的Hash Key(然后问题变得微不足道,但不太可能成为现实世界的问题),或者需要做类似第一个要点的事情在上面的答案中,这仍然是(2.5年后)被认为是不好的做法。 –

相关问题