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

时间戳上的Dynamodb范围查询

虞俊美
2023-03-14

我有一个dynamodb表,其结构如下

userId -> hashkey
timestamp -> sortkey
//other fields

我想在此表上执行两个主要查询。

  1. 获取用户的所有条目-

还有其他建议吗?谢谢你。

2014年5月更新这里发布了一些很好的建议。我仍在尝试如何最好地实现这一点,并希望检查以下方法的优缺点。

Trips: 
  Id -> this is a GUID generated by the API that is inserting data to dynamo
  timestamp -> sortkey
  //other details

UserTrips:
  userId -> hashkey
  tripId -> id from trips table

RecentTrips:
  timeKey -> YYYYMM format hash key
  tripId -> id from trips table

我担心这可能会造成很多不一致,好像对usertrips或recenttrips的插入失败了等等。

共有2个答案

夏侯鹏
2023-03-14

昨天我就这个话题回答了一个类似的问题,因此,如果我的回答有用,请将其链接到此处:https://stackoverflow.com/a/61783992/11986130

简而言之,我决定使用作为我的分区键,这样我就可以使用查询(如果我有很多数据,当然可能是月或其他更合适)。

希望有帮助!

编辑:这种方法不一定没有问题,因为您可能会因为“热分区”而降低性能——也许也值得一看这个答案:https://stackoverflow.com/a/36491475/11986130

郑西岭
2023-03-14

您没有指定正在使用哪个aws sdk,但例如在Java中,您可以通过查询哈希键来解决第2个问题,范围键的条件是其值小于您加载的最后一个项的值。您还必须指定降序,因为ddb查询的默认值是升序。为了进行分页,您只需对查询进行限制,以获得指定的最大项数。

所以你基本上:

  • 将lastLoadedItemTimestamp设置为当前时间戳
  • 使用哈希键A查询10个项目,条件是范围键(即时间戳)小于lastLoadedItemTimestamp
  • 将lastLoadedItemTimestamp设置为加载的最后一个项目的范围键
  • 如果查询返回了10个项目,则在循环中重复上述两个步骤,直到查询返回的项目少于10个为止
 类似资料:
  • 现在,如果我只希望得到时间戳和sensorId,那么我阅读了投影表达式,并尝试执行一个查询(query.json): aws cli命令 给了我:

  • 我们有一个Postgres表(物化视图),其中包含大约200万行,列如下: start_time(timestampz)-有索引 end_time(timestampz)-有索引 对于表中的每一行,我们希望添加一个包含以下内容的结果列: 1,如果行开始和结束时间范围与任何其他行重叠 0,如果行开始和结束时间范围不与任何其他行重叠 将每一行标记为具有重叠(1或0)的有效方法是什么? 编辑: 预期产出

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

  • 我正在尝试评估Cassandra DB在存储和检索不同通道的时间序列数据方面的性能。 数据以文件格式记录,最大记录速率为8个样本/秒,每个样本都有一个以毫秒为单位的时间戳。给定时间记录的通道数可能会有所不同。 受以下链接的启发,我使用时间序列数据建模入门创建了以下表: 创建表uhhdata ( ch_idx int,date timestamp,dt timestamp,val float,PRI

  • 我需要在一定的时间范围内进行查询, 首先,我想做一个查询,比如 结果是 有人能指出我做错了什么吗? 第二,我没有做这个例子https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-daterange-aggregation.html 上面的例子如何适合我的应用,谢谢 杰夫 此

  • Dynamodb具有时间戳属性,以字符串格式存储日期和时间“Thu Jan14 19:55:27UTC 2021”。现在,我想检索介于“Thu Jan11 20:55:27UTC 2021”和“Thu Jan13 22:15:27UTC 2021”之间的记录。下面是代码: 这并没有给出正确的记录集,因为字符串和日期时间之间正在进行比较。未将Attr()转换为datetime。下面是我尝试的代码片段