当前位置: 首页 > 知识库问答 >
问题:

如何查询按“时间戳”排序的dynamodb表?

阴波峻
2023-03-14

我有一个dynamodb表,它有一个分区键ID和排序键timestamp。我需要根据timestamp列查询表以查找最近的100行。当我检查queryAPI时,我必须指定KeyConditions或KeyConditionExpression。在这种情况下,我不想查询分区键。我该怎么做?

scan操作似乎不支持对结果进行排序。

我能想到的一个解决方案是在表中添加一个属性,比如说status,并为表中的每一行指定相同的值。然后在表上创建一个GSI,分区键为status,时间戳为排序键。然后我可以查询分区键等于OK的表,并根据timestamp对结果进行排序。然而,这个解决方案在规模上并不奏效。由于表中的每一行都具有相同的状态值,因此GSI无法很好地缩放。

那么,我的问题的最佳解决方案是什么?我不应该考虑使用DyDoDB吗?


共有2个答案

习狐若
2023-03-14

排序的元素在分区内排序。您需要将所有结果放在同一个分区上。

但显然,您不希望只有一个分区,您将回到一个SQL数据库。在DynamoDB中不舒服和不舒服的方式是使用Streams。当您有新元素或更新时,您可以检查这些元素是否位于顶部N位置。例如,如果他们取代了这个价值,说你有有钱的人:

PK            Attributes:  
#Entity#21    name=Fred.      money=5,000     
#Entity#22    name=Bob.       money=10,000     
#Entity#23    name=Smith.     money=1,000     
...

然后我们可以跟踪十大最富有的人:

PK              SORT               Attributes:      
#Money#Highest    1               id=#Entity#22    value=10,000
#Money#Highest    2               id=#Entity#102   value=9,000
...

然后,当你想要最富有的人时,你用PK=#Money#Highest进行查询。您还可以根据查询在中复制更多属性。如果您想跨分区计算顶部的内容,您可以设置流并自己完成。请注意,根据您的流设置,虽然这些总数将过时几秒钟。您流式传输Lambda将类似于:

const handler = (event, context, callback) => {
    event.Records.forEach((ev, i) => {
        if (ev.eventName === "INSERT" || ev.eventName === "UPDATE" || ) {
          // TODO
        }
      }
    }

我知道这很烦人!但这是实现这些东西的奇怪方式。但它非常快,因为您只检索预先计算的值。这就是使用Dynamo的整个方式,存储成本低,计算成本高,优化计算,并根据需要复制数据,因为无论如何它都很便宜。

梁俊友
2023-03-14

你的方法是有效的。如果您将GSI分区键中的伪值保持在较小的位置(即一个字节),则不会对性能产生太大影响。关于具有相同分区键的所有项的缩放问题,如果集合大小增长超过10GB,DynamoDB将按排序键拆分分区。

请看一看这个与你类似的StackOverflow问题。

 类似资料:
  • 在DynamoDB中,我有一个表,其中每条记录都有两个日期属性,

  • 问题内容: 因此,我的时间戳如下所示: 我将它们放在DataFrame中,并且尝试按升序对其进行排序。我尝试了以下方法。但是,它似乎不起作用 任何帮助表示赞赏。 问题答案: 您只需要确保正确表示格式规范,就可以将其转换为之前的 实际 日期时间。 这比分解组件中的时间戳并按照您的尝试执行多准则排序要直接得多。 演示版

  • 我有一个dynamodb表,其结构如下 我想在此表上执行两个主要查询。 获取用户的所有条目- 还有其他建议吗?谢谢你。 2014年5月更新这里发布了一些很好的建议。我仍在尝试如何最好地实现这一点,并希望检查以下方法的优缺点。 我担心这可能会造成很多不一致,好像对usertrips或recenttrips的插入失败了等等。

  • 本文向大家介绍MongoDB中如何按时间戳(降序)排序,包括了MongoDB中如何按时间戳(降序)排序的使用技巧和注意事项,需要的朋友参考一下 要按时间戳排序,请在MongoDB中使用sort()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是按时间戳排序的查询(降序)- 这将产生以下输出-

  • 问题内容: 我正在尝试按其类型为time.Time的成员在Go中对结构进行排序。结构如下。 我具有以下用于排序的功能 映射定义如下 在地图填充值之后,按值对地图进行排序如下 问题是结果没有排序,谁能告诉我问题是什么。 问题答案: 在我看来,它看起来像是: 输出:

  • 如有任何帮助,不胜感激