2013-07-15 72 views
10

有没有办法在Amazon的AWS SDK for Java中使用单个查询查询多个哈希键?有没有办法在DynamoDB中查询多个哈希键?

这是我的问题;我有一个项目状态的数据库表。哈希键是项目的状态(即:新建,分配,处理或完成)。范围键是一组项目ID。目前,我已经有了一个查询设置,可以简单地查找列为“已分配”状态(哈希)的所有项目,并设置另一个查询以查找“处理”状态。有没有办法使用单个查询来完成此操作,而不是针对每个需要查找的状态发送多个查询?代码如下:

DynamoDBMapper mapper = new DynamoDBMapper(new AmazonDynamoDBClient(credentials)); 
    PStatus assignedStatus = new PStatus(); 
    assignedStatus.setStatus("assigned"); 
    PStatus processStatus = new PStatus(); 
    processStatus.setStatus("processing"); 

    DynamoDBQueryExpression<PStatus> queryAssigned = new DynamoDBQueryExpression<PStatus>().withHashKeyValues(assignedStatus); 
    DynamoDBQueryExpression<PStatus> queryProcessing = new DynamoDBQueryExpression<PStatus>().withHashKeyValues(processStatus); 

    List<PStatus> assigned = mapper.query(PStatus.class, queryAssigned); 
    List<PStatus> process = mapper.query(PStatus.class, queryProcessing); 

所以基本上,我想知道是否有可能通过相同的查询,process消除queryAssignedassigned变量和同时处理assignedStatusprocessStatus,发现没有新的或项目完成。

+0

http://aws.typepad.com/aws/2013/ 04/local-secondary-indexes-for-amazon-dynamodb.html – Guy

+0

对不起,这甚至不是我所要求的,我已经知道二级索引。 – DGolberg

+0

我认为你的问题表明你的模式需要不同。如果你反复需要查询2个散列键,那么可能它本身应该是一个特殊的散列键(从两个状态复制数据)。 – alexandroid

回答

7

不,截至今日,无法在同一请求中发送多个查询。如果您担心延迟,可以在不同的线程中同时发出多个请求。如果Dynamo提供的话,这需要与“双查询”相同数量的网络带宽(假设您制作2个而不是数百个)。

+0

这更多的是一次发送字符串的想法,让服务器比较它正在检查的当前项目,然后再移动到下一个项目进行检查。查询它是否可以实现我想象的效果会更有效,但我想我必须等待,看看他们是否决定在一天内完成此操作。 *有希望,但没有期待太多*感谢您的回应,至少...我现在必须做双/三重查询。 – DGolberg

+0

@Dolgberg实际上,据我所知,dynamodb存储了每个哈希键的范围键索引,这些索引完全相互分离,甚至可能在不同的分区/主机上。因此,通过实施多重查询,发电机必须增加开销,如“1次失败,1次失败时会发生什么?”。 “如果一个人被扼杀,会怎么样?”,“如果一个人更快?(哪个主机等待并完成数据连接)?”等等。这是我猜测为什么他们没有实现它。也就是说,“简单”的胜利对于客户来说是相当大的,所以如果他们有一天添加了它,它不会让我感到惊讶。 –

+0

有趣。我并不太熟悉DynamoDB的内部工作,所以感谢那些信息。如果/当他们执行这样的事情时,我必须确保更新它,因为当需要多个查询时它肯定会加快速度。 – DGolberg

-2

您可能会看到BatchGetItem操作或batchLoad()方法的DynamoDBMapper。虽然有点不同于查询,但它不是一个在散列键上具有OR条件的查询,它将允许您完成(通常)相同的事情。这里是language agnostic documentation,这里是Javadoc

+0

不起作用。当一个表包含一个或者你得到一个'DynamoDBMappingException'时,你必须为'batchLoad()'操作提供一个范围键。这可以防止您简单地抓取所有散列键相同的项目。例如;假设你有一个服务器列表。该列表告诉你哪些服务器在线/离线/暂停/等等。通过散列键和服务器名称是通过范围键。我知道的唯一方法是让所有列为在线的服务器以及列为脱机服务器(不知道其个人名称)的服务器进行扫描或2次查询。 – DGolberg

-2

亚马逊API不支持多hashkey过滤器,但你可以使用散列键+ RANGE键过滤器使用batchGetItem方法得到的结果..

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/batch-operation-lowlevel-java.html#LowLevelJavaBatchGet

+0

这是最后一张海报的建议,它不适用于这种情况。查询的全部目的是查找与特定状态相匹配的ID(顺便说一句,这也是范围键)。 'batchGetItem'请求要求你知道散列和范围键。我甚至有一个范围键的唯一原因是我可以有多个具有相同值的散列键,这些键可以被查询。 – DGolberg

3

有没有办法通过多个哈希查询键,但是,截至2014年4月,您可以使用QueryFilter,以便除了哈希键字段以外,还可以通过非键字段进行过滤。

在2014年4月24日博客中,AWS公布了“QueryFilter”选项的版本:

通过今天的发布,我们正在扩大这种模式,可支持查询过滤非关键属性。您现在可以包含一个QueryFilter作为对查询函数调用的一部分。过滤器在基于密钥的检索之后并在结果返回给您之前应用。过滤这种方式可以减少返回到您的应用程序的数据量,同时简化和精简代码

检查了这一点有 http://aws.amazon.com/blogs/aws/improved-queries-and-updates-for-dynamodb/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+AmazonWebServicesBlog+%28Amazon+Web+Services+Blog%29

+0

@AybatDuyshokov QueryFilter过滤部分的性能与Scan相同吗? –

+1

Tuukka Mustonen 1.通过散列键选择2.使用查询过滤器过滤结果集(是,这一步的执行与扫描相同)3.返回最终结果集。 – Aybat

相关问题