2013-07-05 81 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年後)被認爲是不好的做法。 –

相關問題