Azure-DocumentDb:Group BY Query中的Top1

时间:2015-08-12 06:10:52

标签: database azure database-design database-schema azure-cosmosdb

我正在使用DocumentDB存储用户数据以供Google Analytics使用。在我的收藏中,每个用户每天将有10-15行,各自的时间戳为UTC。

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

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

1 个答案:

答案 0 :(得分:3)

以前有一种方法在我使用MongoDB时很适合我,而我正在使用DocumentDB实现这个方法:

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

  2. 然后你需要一种方法将当天结束时从管理员的时区转移到祖鲁时间。为此,我在npmjs包TimetzTime(包括tzTime)中创建了Lumenize对象。在2015-08-11的一天结束时,new Time('2015-08-11').getISOStringInTZ('America/Denver')返回2015-08-11T06:00:00.000Z,表示丹佛距格林威治标准时间6小时。 TZTime / Lumenize包含Olson时区文件,因此您可以对历史记录中的任何点进行此转换。 Joda时间为Java做了类似的事情。关于.NET不确定。如果您需要为过去30天创建一组这样的时间戳,tzTime / Lumenize包含Timeline对象,它允许您指定时间范围,时区,甚至允许您淘汰周末和假期。它将返回此类时间戳的列表。

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

  4. 这是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的下一件事。如果您使用它,请告诉我,我会优先考虑它,并在完成后通知您。