gpt4 book ai didi

database - Azure-DocumentDb : Top1 in Group BY Query

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:22 27 4
gpt4 key购买 nike

我正在使用 DocumentDB 存储用户数据以用于分析目的。在我的集合中,每个用户每天将有 10-15 行,并带有各自的 UTC 时间戳。

我想编写一个查询来向管理员显示数据,为每个用户选择每天的最后记录,并调整管理员的时区。

Anu 关于我应该如何存储我的记录以使查询更快的建议,或者关于我应该如何形成查询的任何建议?

最佳答案

这是一种过去在 MongoDB 上对我很有效的方法,我正在使用 DocumentDB 实现:

  1. 首先,为每一行存储一个 _ValidFrom 和 _ValidTo 字段。当您为用户创建第一行时,_ValidFrom 将是创建时间。确保所有时间戳均采用祖鲁 (GMT) 时间(例如“2015-08-12T12:34:56.789Z”。_ValidTo 设置为某个值,表示正无穷大。我使用字符串“9999-01-01T01: 01:01.000”,但如果您将日期存储为整数,则可以使用 MAXINT。然后,当您获取第二条和后续记录时,将前一条记录的 _ValidTo 更新为等于 now,这也是您为 _ValidFrom 设置的值新记录。新记录有一个 _ValidTo 代表正无穷大。是的,这意味着每次更新都涉及一次读取和两次写入。使用存储过程,因此这是原子的。

  2. 那么您需要一种方法将一天的结束时间从管理员时区转换为祖鲁时间。我创建了Time npmjs 包中的对象 tzTimeLumenize (包括 tzTime)用于此目的。 2015年8月11日结束时,new Time('2015-08-11').getISOStringInTZ('America/Denver')返回2015-08-11T06:00:00.000Z表明丹佛与 GMT 相差 6 小时。 TZTime/Lumenize 包含 Olson 时区文件,因此您可以对历史上的任何点进行此转换。 Joda time 对 Java 做了类似的事情。不确定 .NET。如果您需要为过去 30 天创建一组此类时间戳,tzTime/Lumenize 包括 Timeline对象,它允许您指定时间范围、时区,甚至允许您排除周末和节假日。它将返回此类时间戳的列表。

  3. 最后,您需要提交一个查询,该查询将仅返回每个用户在该日期的最后一条记录。 _ValidTo > [TZShiftedEndOfDay] AND _ValidFrom <= [TZShiftedEndOfDay]

这是一个slide deck that explains this approach in greater detail从幻灯片 10 开始。这是 post that explains my philosophy about timezone precise programming 。另外,我已将一些 Lumenize 作为存储过程移至 DocumentDB 中,并且我正在考虑移动更多内容。 Lumenize TimeSeriesCalculator 将在 DocumentDB 上的存储过程中完成所有这些操作。这是我列表中的下一个要移植到 DocumentDB 的项目。如果您愿意使用它,请告诉我,我会优先考虑它,并在完成后通知您。

关于database - Azure-DocumentDb : Top1 in Group BY Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31957260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com