2017-07-14 61 views
0

团队,Dynamodb查询表达式

我有一个给定的哈希键(userid)和排序键(年龄)的dynamodb。比方说,如果我们想要将元素检索为“每个hashkey(userid),最小年龄”输出,那么查询和过滤器表达式将用于发电机查询。

谢谢!

回答

0

我不认为你可以在查询中做到这一点。你需要做全表扫描。如果你有一个哈希键列表,那么你可以做N个查询(并行)。

[更新]这是另一种可能的方法: 维护第二个表,其中只有一个散列键(userID)。该表将包含给定用户的年龄最小的记录。要做到这一点,请确保每次更新主表时,如果第二个表中的新年龄小于当前年龄,则还要更新第二个表。你可以使用条件更新。更新可以由应用程序本身完成,也可以让AWS lambda监听dynamoDB流。现在,如果您需要每次使用的最小年龄,您仍然对第二张表进行全表扫描,但是此扫描只会读取相关记录,因此它将是最佳选择。

+0

做到这一点请告诉我实现使用dynamodb这些类型的用例的最佳方式?可以说哈希键不存储在某个地方。 – Santhosh

+0

我用一种可能的方法更新了我的答案。还有其他人。 –

0

有两种方法可以实现的是:

如果您不需要实时获取这些数据您可以将数据导出到其他AWS系统,如EMRRedshift并执行复杂的分析查询那里。有了这个,你可以使用连接和操作符来编写SQL表达式。

您甚至可以对DynamoDB数据执行EMR Hive查询,但它们执行扫描,所以它不是非常经济高效。

另一种选择是使用DynamoDB流。您可以维护一个单独的表,用于存储:

表:MinAges

用户ID - 主键

MINAGE - 常规数值属性

在每次更新/删除/插入您可以查询最新用户的最低年龄并将其存储到MinAges

另一种选择是写这样的:

storeNewAge(userId, newAge) 
def smallestAge = getSmallestAgeFor(userId) 
storeSmallestAge(userId, smallestAge) 

但由于DynamoDB不具有本地事务的支持是很危险的运行这样的代码,因为你可能有不一致的数据结束了。您可以使用DynamoDB transactions library,但这些交易are expensive。而如果您使用的是流媒体,则会以非常低的价格获得一致的数据。

0

可以使用ScanIndexForward

YourEntity requestEntity = new YourEntity(); 
requestEntity.setHashKey(hashkey); 
DynamoDBQueryExpression<YourEntity> queryExpression = new DynamoDBQueryExpression<YourEntity>() 
      .withHashKeyValues(requestEntity) 
      .withConsistentRead(false); 
equeryExpression.setIndexName(IndexName); // if you are using any index 
queryExpression.setScanIndexForward(false); 
queryExpression.setLimit(1);