由两个 ISO 8061 日期 return 组成的复合排序键的 DynamoDB 查询的结果是否正确(BETWEEN)?
Do DynamoDB Queries of composite Sort Key's made of two ISO 8061 dates return correct results (with BETWEEN)?
似乎在 DynamoDB 中处理 Sort Key Date 对象(ISO 8061 格式)的共识是使用 STRING 键类型,其中查询案例将使用 BETWEEN 比较来查找两个日期之间的结果(也是 ISO 8061 ), 见答案:
My Question is does the mechanics of the DynamoDB string comparison 'BETWEEN' that enables the above functionality ALSO allow you to query TWO date objects stitched together (example: 2018-05-01-2018-05-10) as a single Sort Key where the first stitched date is ALWAYS before the second stitched date.
After initial testing it APPEARS that the answer is YES, so long as your BETWEEN query also has two concatenated dates this should be possible.
I am hoping someone can help me figure out whether this would be safe / stable to deploy.
在我们进入后台之前,我想我会 post 我的测试用例在这里阐明我的要求。
给定排序键:2018-05-01-2018-05-25
- 查询在 2018-05-01-2018-05-20 和 2018-05-01-2018-05-26 之间(RETURNS 项)
- 查询在 2018-05-01-2018-05-20 和 2018-05-01-2018-05-24 之间
(未找到数据)
- 查询在 2018-05-01-2018-05-20 和 2018-05-01-2018-05-25 之间(RETURNS 项)
- 2018-05-02-2018-05-20 和 2018-05-02-2018-05-26 之间的查询(未找到数据)
背景
我正在构建一个可查询的 DynamoDB table 航班组合,我希望查询检查出发航班日期是否在某个日期之后以及回程航班是否在某个日期之前日期。
基本上我的理解是,由于数字从左到右(年-月-日)级联的方式,BETWEEN 在 DynamoDB 中对 ISO 8061 日期的查询有效。如果是这种情况,那么(在我的情况下)将两个日期连接成一个排序键应该是安全的。
排序键值的表示为...
- 出发日期 1-返回日期 2
- 年月日年月日
我正在预先检查数据,以便可以假设出发航班(第一个串联日期)总是在返回航班(第二个串联日期)之前,如果它在我们的 table 中,因此给出一个 BETWEEN 操作我的假设是这应该是可能的。
I will post back after more testing but I am hoping someone has more experience with exactly how (and why) the DynamoDB BETWEEN Query function works in this case.
发布这个答案,因为我已经在生产中使用上面的一段时间了。
简答:
Sort of, depending on your goals. You can chain multiple ISO 8061 dates in a Sort Key on DynamoDB and use the Between function — however the second date will still need to be run through a Filter to ensure perfect adherence.
更长的回答示例
如果您的目标是使用复合排序键首先减少 returned 的记录数,然后对其进行过滤 — 那么没问题。它实现了限制您需要过滤的记录数量的目标(因为在许多情况下,Sort Key BETWEEN 查询实际上确实过滤掉了不匹配的垃圾)。
但是它不起作用/return 目标结果在所有情况下。
因此,对于 DyanmoDB 中的一个示例数据(排序键):
2018-09-01_2018-09-07
我们的目标是仅 return 包含开始日期(示例中为 2018-09-01)和结束日期(示例中为 2018-09-07)的数据上面的示例)在我们的查询范围内。
对上述数据对象 return 的一个简单示例查询是:
Between 2018-08-15_2018-09-07 and 2018-09-05_2018-09-08
起初看起来查询有效(如我原来的问题中所述),因为上面 return 示例数据。 问题是情况并非总是如此。
破坏示例排序键
复合 ISO 8061 排序键日期的示例将由上述查询 returned 但实际上不符合我们查询意图的目标开始/结束日期是:
2018-09-04_2018-09-15
虽然初始开始日期在我们的目标范围内 - 开始日期小于开始日期最大值 (2018-09-05) 的事实导致允许结束日期超过我们理想的结束日期最大值 -因为总数仍然小于我们的最大值。
这是因为 DynamoDB 如何看待查询之间...
逻辑之间的DynamoDB笔记
DynamoDB 基本上将 ISO 8061 日期视为相同日期的数字表示,没有破折号。所以 2018-09-01 = 20180901。由于 ISO 8061 日期从最大到最小级联,其中两个一起看起来(对 Dynamo)如下所示:
2018090120180907.
一旦它删除了彼此匹配的字符,它就会对数字大于/小于进行简单比较。
还有用吗?
因此,如前所述,您确实从 Between 查询中获得了您不想要的数据,该查询适用于将两个(或更多)ISO 8061 日期串联在一起的复合排序键。但是,如果您的目标是首先减少 returned 的记录数量,以便更有效地进行过滤——那么这仍然是一件好事(取决于您的用例)。
You just have to plan to ALSO run a Filter against your returned Query data to ensure that all dates are within bounds.
似乎在 DynamoDB 中处理 Sort Key Date 对象(ISO 8061 格式)的共识是使用 STRING 键类型,其中查询案例将使用 BETWEEN 比较来查找两个日期之间的结果(也是 ISO 8061 ), 见答案:
My Question is does the mechanics of the DynamoDB string comparison 'BETWEEN' that enables the above functionality ALSO allow you to query TWO date objects stitched together (example: 2018-05-01-2018-05-10) as a single Sort Key where the first stitched date is ALWAYS before the second stitched date.
After initial testing it APPEARS that the answer is YES, so long as your BETWEEN query also has two concatenated dates this should be possible.
I am hoping someone can help me figure out whether this would be safe / stable to deploy.
在我们进入后台之前,我想我会 post 我的测试用例在这里阐明我的要求。
给定排序键:2018-05-01-2018-05-25
- 查询在 2018-05-01-2018-05-20 和 2018-05-01-2018-05-26 之间(RETURNS 项)
- 查询在 2018-05-01-2018-05-20 和 2018-05-01-2018-05-24 之间 (未找到数据)
- 查询在 2018-05-01-2018-05-20 和 2018-05-01-2018-05-25 之间(RETURNS 项)
- 2018-05-02-2018-05-20 和 2018-05-02-2018-05-26 之间的查询(未找到数据)
背景
我正在构建一个可查询的 DynamoDB table 航班组合,我希望查询检查出发航班日期是否在某个日期之后以及回程航班是否在某个日期之前日期。
基本上我的理解是,由于数字从左到右(年-月-日)级联的方式,BETWEEN 在 DynamoDB 中对 ISO 8061 日期的查询有效。如果是这种情况,那么(在我的情况下)将两个日期连接成一个排序键应该是安全的。
排序键值的表示为...
- 出发日期 1-返回日期 2
- 年月日年月日
我正在预先检查数据,以便可以假设出发航班(第一个串联日期)总是在返回航班(第二个串联日期)之前,如果它在我们的 table 中,因此给出一个 BETWEEN 操作我的假设是这应该是可能的。
I will post back after more testing but I am hoping someone has more experience with exactly how (and why) the DynamoDB BETWEEN Query function works in this case.
发布这个答案,因为我已经在生产中使用上面的一段时间了。
简答:
Sort of, depending on your goals. You can chain multiple ISO 8061 dates in a Sort Key on DynamoDB and use the Between function — however the second date will still need to be run through a Filter to ensure perfect adherence.
更长的回答示例
如果您的目标是使用复合排序键首先减少 returned 的记录数,然后对其进行过滤 — 那么没问题。它实现了限制您需要过滤的记录数量的目标(因为在许多情况下,Sort Key BETWEEN 查询实际上确实过滤掉了不匹配的垃圾)。
但是它不起作用/return 目标结果在所有情况下。
因此,对于 DyanmoDB 中的一个示例数据(排序键): 2018-09-01_2018-09-07
我们的目标是仅 return 包含开始日期(示例中为 2018-09-01)和结束日期(示例中为 2018-09-07)的数据上面的示例)在我们的查询范围内。
对上述数据对象 return 的一个简单示例查询是:
Between 2018-08-15_2018-09-07 and 2018-09-05_2018-09-08
起初看起来查询有效(如我原来的问题中所述),因为上面 return 示例数据。 问题是情况并非总是如此。
破坏示例排序键
复合 ISO 8061 排序键日期的示例将由上述查询 returned 但实际上不符合我们查询意图的目标开始/结束日期是:
2018-09-04_2018-09-15
虽然初始开始日期在我们的目标范围内 - 开始日期小于开始日期最大值 (2018-09-05) 的事实导致允许结束日期超过我们理想的结束日期最大值 -因为总数仍然小于我们的最大值。
这是因为 DynamoDB 如何看待查询之间...
逻辑之间的DynamoDB笔记
DynamoDB 基本上将 ISO 8061 日期视为相同日期的数字表示,没有破折号。所以 2018-09-01 = 20180901。由于 ISO 8061 日期从最大到最小级联,其中两个一起看起来(对 Dynamo)如下所示: 2018090120180907.
一旦它删除了彼此匹配的字符,它就会对数字大于/小于进行简单比较。
还有用吗?
因此,如前所述,您确实从 Between 查询中获得了您不想要的数据,该查询适用于将两个(或更多)ISO 8061 日期串联在一起的复合排序键。但是,如果您的目标是首先减少 returned 的记录数量,以便更有效地进行过滤——那么这仍然是一件好事(取决于您的用例)。
You just have to plan to ALSO run a Filter against your returned Query data to ensure that all dates are within bounds.