Dynamodb查询表达式

时间:2017-07-14 16:36:20

标签: amazon-dynamodb

我有一个带有给定hashkey(userid)和排序键(年龄)的dynamodb。假设我们想要检索元素为“每个hashkey(userid),最小年龄”输出,那么Dynamo查询的查询和过滤表达式是什么。

谢谢!

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

有两种方法可以实现这一目标:

如果您不需要实时获取此数据,则可以将数据导出到其他AWS系统,例如EMRRedshift,并在那里执行复杂的分析查询。通过这种方式,您可以使用连接和运算符分组来编写SQL表达式。

您甚至可以对DynamoDB数据执行EMR Hive查询,但它们会执行扫描,因此效率不高。

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

表: MinAges

UserId - 主键

MinAge - 常规数字属性

在原始查询的每次更新/删除/插入时,您都可以查询更新用户的最低年龄并存储到 MinAges

另一种选择是写下这样的东西:

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

但是,由于DynamoDB没有本机事务支持,因此运行这样的代码是危险的,因为您可能最终会得到不一致的数据。您可以使用DynamoDB transactions library,但这些交易are expensive。如果您使用流,则会以非常低的价格获得一致的数据。

答案 2 :(得分: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);