Java DynamoDB排序键上的多个比较条件?
我将AWS SDK2 DynamoDB用于具有以下模式的应用程序:Java DynamoDB排序键上的多个比较条件?,java,amazon-web-services,nosql,amazon-dynamodb,Java,Amazon Web Services,Nosql,Amazon Dynamodb,我将AWS SDK2 DynamoDB用于具有以下模式的应用程序: personId startDate endDate name age job 1 10/2/2013 10/3/2020 Bob 12 SWE 1 8/2/2013 10/3/2021 Bob 12 EE 2 10/2/2013 10/3/2021 Joe 17 Stude
personId startDate endDate name age job
1 10/2/2013 10/3/2020 Bob 12 SWE
1 8/2/2013 10/3/2021 Bob 12 EE
2 10/2/2013 10/3/2021 Joe 17 Student
3 11/2/2013 10/3/2022 Kim 16 Boss
我的目标是能够通过personId
和date
查询表,以便检索person对象。目前,我正在考虑在personId
上设置一个分区键
;但是,我不知道如何设计我的sortKey
例如,假设我想要一个person
且personId=1
和日期=10/5/2019
,我希望返回示例表的第一个和第二个条目,因为日期介于开始日期
和结束日期
之间。如何设计sortKey,以便使用适当的键条件表达式表示startDate
和endDate
之间的日期?我知道可以使用筛选器表达式,但我想知道是否有一种方法可以设计排序键,这样就不需要筛选器,因为它的成本更高。不,您不能
你为什么需要一个排序键呢?如果personId是唯一的,则不需要复合主键(哈希+排序)
由于您在阅读时知道personId,所以可以使用GetItem(table,HK=:personId)
编辑
鉴于personId不是唯一的附加信息
将startDate作为您的排序键
您可以查询(table,HK=:personId,SK不,您不能
为什么还需要排序键?如果personId是唯一的,则不需要复合主键(哈希+排序)
由于您在阅读时知道personId,所以可以使用GetItem(table,HK=:personId)
编辑
鉴于personId不是唯一的附加信息
将startDate作为您的排序键
您可以查询(table,HK=:personId,SK)给定personId的实际行数(项数)?如您所愿。谢谢,原始示例中不清楚。有多少行(项)对于给定的personId,您真的可以拥有吗?非常感谢,这在最初的示例中并不清楚。例如,假设personId有多个startDate和endDate,因为还有一个名为job的附加字段。sortkey的目的是检索带有personId的所有人员/对象,并使日期介于startDate和endDate之间ate和endDate。不确定最新更新是否实际给出了正确的结果。我认为给定personId的日期范围可能重叠,并且可能在请求的日期有多个作业处于活动状态。因此,您不能使用limit=1。此外,您需要对结果集应用进一步筛选,以确保结束日期不在请求之前ted日期。我没有看到帖子的更新…但是如果是那么糟糕,OP应该计划在DDB和过滤中支付更多的RCU费用(可能在客户端)…或者多花一点钱使用RDB..DDB不是所有事情的最佳选择。正如@jarmod所说的!我想知道是否有可能不用过滤就可以做到这一点。此外,我同意DDB不是所有事情的最佳选择,但不幸的是,这是我们的选择。谢谢Charles,这也是我的想法。不可能通过使用一些奇怪的排序键来查找它。我可能会使用筛选器或在我这方面做一些事情。例如,personId有多个startDate和endDate,因为还有一个名为job的附加字段。排序键的目的是检索personId的所有人员/对象,并使日期介于startDate和endDate之间。不确定测试更新实际上给出了正确的结果。我认为给定personId的日期范围可能重叠,并且有可能在请求的日期有多个作业处于活动状态。因此,您不能使用limit=1。此外,您需要对结果集应用进一步的筛选,以确保结束日期不早于请求的日期。我没有看到更新但如果是这样的话,OP应该计划在DDB和过滤中支付更多的RCU费用(也许是在客户端)…或者多花一点钱使用RDB..DDB不是所有事情的最佳选择。正如@jarmod所说的!我想知道是否有可能不用过滤就可以做到这一点。此外,我同意DDB不是所有事情的最佳选择,但不幸的是,这是我们的选择。谢谢Charles,这也是我的想法。不可能通过使用一些奇怪的排序键来查找它。我可能会使用过滤器或在我这方面做一些事情。
select *
from table
where personId = :personId
and startDate <= :date
order by startDate desc
fetch first row only