我有一个给定的哈希键(userid)和排序键(年龄)的dynamodb。比方说,如果我们想要将元素检索为“每个hashkey(userid),最小年龄”输出,那么查询和过滤器表达式将用于发电机查询。
谢谢!
我有一个给定的哈希键(userid)和排序键(年龄)的dynamodb。比方说,如果我们想要将元素检索为“每个hashkey(userid),最小年龄”输出,那么查询和过滤器表达式将用于发电机查询。
谢谢!
我不认为你可以在查询中做到这一点。你需要做全表扫描。如果你有一个哈希键列表,那么你可以做N个查询(并行)。
[更新]这是另一种可能的方法: 维护第二个表,其中只有一个散列键(userID)。该表将包含给定用户的年龄最小的记录。要做到这一点,请确保每次更新主表时,如果第二个表中的新年龄小于当前年龄,则还要更新第二个表。你可以使用条件更新。更新可以由应用程序本身完成,也可以让AWS lambda监听dynamoDB流。现在,如果您需要每次使用的最小年龄,您仍然对第二张表进行全表扫描,但是此扫描只会读取相关记录,因此它将是最佳选择。
有两种方法可以实现的是:
如果您不需要实时获取这些数据您可以将数据导出到其他AWS系统,如EMR或Redshift并执行复杂的分析查询那里。有了这个,你可以使用连接和操作符来编写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。而如果您使用的是流媒体,则会以非常低的价格获得一致的数据。
可以使用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);
做到这一点请告诉我实现使用dynamodb这些类型的用例的最佳方式?可以说哈希键不存储在某个地方。 – Santhosh
我用一种可能的方法更新了我的答案。还有其他人。 –