Java 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

我将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   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