在DynamoDB中处理Sort Key Date对象(ISO 8061格式)的共识似乎是使用STRING键类型,其中查询案例将使用BETWEEN比较来查找两个日期之间的结果(也是ISO 8061),请参阅答案:
我的问题是,启用上述功能的DynamoDB字符串比较'BETWEEN'的机制是否允许您查询拼接在一起的两个日期对象(例如:2018-05-01-2018-05-10)作为单个排序键第一个缝合日期始终在第二个缝合日期之前。
在初始测试后,它显示答案为YES,只要您的BETWEEN查询也有两个连接日期,这应该是可能的。
我希望有人可以帮我弄清楚这是否安全/稳定部署。
在我们进入后台之前,我想我会在这里发布我的测试用例,以明确我的要求。
鉴于排序键:2018-05-01-2018-05-25
我正在构建一个可查询的DynamoDB飞行组合表,我希望查询检查离开的航班日期是否在特定日期之后,以及返回的航班是否在特定日期之前。
基本上我的理解是,由于数字从左到右(年 - 月 - 日)级联的方式,BETWEEN在DynamoDB上的ISO 8061日期查询工作。如果是这种情况,那么将两个日期连接成一个排序键应该是安全的(在我的情况下)。
排序键值的表示将是......
我正在预先检查数据,以便假定离开的航班(第一个连锁日期)总是在返回航班(第二个连锁日期)之前,如果它在我们的表格中,那么因此给出了一个BETWEEN操作我的假设是这个应该是有可能。
我会在经过更多测试后回复,但我希望有人在这种情况下确切知道DynamoDB BETWEEN Query函数的工作原理(以及为什么)。
发布这个答案,因为我已经在生产中使用了上述一段时间了。
简答:
根据您的目标排序。您可以在DynamoDB上的排序键中链接多个ISO 8061日期并使用Between功能 - 但是仍然需要通过Filter运行第二个日期以确保完美遵守。
如果你的目标是使用复合排序键首先减少返回的记录数,然后过滤掉那么 - 那就没关系了。它实现了限制过滤所需记录数量的目标(因为在很多情况下,排序键BETWEEN查询实际上会过滤掉不匹配的垃圾)。
但是在所有情况下它都不起作用/返回目标结果。
因此,对于DynamoDB中的示例数据(排序键):2018-09-01_2018-09-07
我们这里的目标是仅返回数据,其中开始日期(在示例的情况下为2018-09-01)和结束日期(在上例的情况下为2018-09-07)在范围内我们之间的查询。
返回上述数据对象的简单示例查询将是:
Between 2018-08-15_2018-09-07 and 2018-09-05_2018-09-08
首先看起来查询有效(如我原来的问题所述),因为上面的DOES返回了示例数据。问题是情况并非总是这样。
上述查询将返回但实际上不符合我们的查询意图的目标开始/结束日期的复合ISO 8061排序关键日期的示例将是:
2018-09-04_2018-09-15
虽然初始开始日期在我们的目标范围内 - 开始日期小于开始日期最大值(2018-09-05)的事实导致结束日期超过我们理想的结束日期最大值 - 因为总数是仍小于我们的最大值。
这是因为DynamoDB在查询之间查看...
DynamoDB基本上将ISO 8061日期视为没有破折号的同一日期的数字表示。所以2018-09-01 = 20180901。由于ISO 8061日期级联从最大到最小两个一起看起来(对Dynamo)像这样:2018090120180907。
一旦删除了彼此匹配的字符,它就会对数值大于/小于进行简单比较。
因此,如前所述,您确实获得了不希望从Between查询返回的数据,其中适用于连接在一起的两个(或更多)ISO 8061日期的复合排序键。但是,如果你的目标是首先减少返回的记录数量,以便更有效地过滤 - 那么这仍然是一件好事(取决于你的用例)。
您只需计划对返回的查询数据运行过滤器,以确保所有日期都在边界内。