我刚开始使用 NoSQL 数据库。我在 DynamoDB 中有一个表,其中包含超过 100k 个项目。此外,此表会经常刷新。在这张表上,我希望能够在关系数据库世界中做类似的事情:
Select *
from tableName
where attributeName = (Select MAX(attributeName) from tableName);
有没有什么便宜的方法可以做到这一点而不必将所有行提取到我的 Java 代码中?任何输入/指针将不胜感激。谢谢。
最佳答案
在不增加空间或复杂性的情况下,没有便宜的方法可以做到这一点。
昂贵的方法是扫描整个表,仅检索关键属性和 attributeName
属性,计算最大值,然后获取您找到的所有(完整)项目最大。
如果您有一个复合键(散列和范围)和几个散列键相对于表中的总项目,Local secondary indexes会有所帮助,而且只需要一点点空间。您可以在 attributeName
属性上有一个索引,然后使用该索引查询每个散列键,并使用“isScanIndexForward:false”和“limit:1”从该 hashKey 中获取“max” .然后计算所有结果的最大值(每个哈希键有 1 个结果),并且您知道要检索的值。您可以用几乎相同的方式检索它们,在 attributeName
上使用向后扫描和“EQ”条件。
如果您愿意增加复杂性,您可以将此信息存储在一个额外的表中。像 tableName.extraInfo
这样的东西,它有一个像这样的项目:{hashKey: "maxOfAttributeName", "value":5}
。然后,当您 put
或 update
主表时,您也更新了这个字段,瞧,您有了您的值。如果您的数据变化很快,请注意这种方法带来的事务复杂性。
关于java - Amazon DynamoDB 中的 MAX 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18219562/