如何从DynamoDB获取每个主分区键的最新数据?

时间:2019-05-14 18:10:37

标签: amazon-web-services amazon-dynamodb

我在发电机组中有一张桌子。它存储帐户统计信息。帐户统计信息可能每天都会更新几次。因此表记录可能如下所示:

+------------+--------------+-------+-------+
| account_id | record_id    | views | stars |
+------------+--------------+-------+-------+
| 3          | 2019/03/16/1 | 29    | 3     |
+------------+--------------+-------+-------+
| 2          | 2019/03/16/2 | 130   | 21    |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/3 | 12    | 2     |
+------------+--------------+-------+-------+
| 2          | 2019/03/16/1 | 57    | 12    |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/2 | 8     | 2     |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/1 | 3     | 0     |
+------------+--------------+-------+-------+

account_id是主分区键。 record_id是主要的排序键

如何仅获取每个account_id的最新记录?因此,从上面的示例中,我希望得到:

+------------+--------------+-------+-------+
| account_id | record_id    | views | stars |
+------------+--------------+-------+-------+
| 3          | 2019/03/16/1 | 29    | 3     |
+------------+--------------+-------+-------+
| 2          | 2019/03/16/2 | 130   | 21    |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/3 | 12    | 2     |
+------------+--------------+-------+-------+

此数据可方便地用于报告目的。

2 个答案:

答案 0 :(得分:1)

具有相同分区键的项目存储在同一分区中,并按其排序键排序。因此,如果您反向查询商品并将其限制设置为1,则将获得带有必需的account_id和最大值record_id的商品。

因此,请在相关的account_id上进行查询,但要指定Limit=1ScanIndexForward=False(或Reverse=True,具体取决于您使用的SDK / API)。

答案 1 :(得分:1)

如果您知道存储在表中的account_id列表,则可以非常有效地完成此操作。

在这种情况下,您需要做的就是一次查询主键,使用ScanIndexForward=False对值进行排序,并使用Limit=1将结果限制为1。

这是python中的代码

import boto3
import json

client = boto3.client('dynamodb')

account_ids = ['1', '2', '3']
results = []

for aid in account_ids:
    result = client.query(
        TableName='test-table',
        KeyConditionExpression="#aid = :aid",
        ExpressionAttributeNames={
            '#aid': 'account_id'
        },
        ExpressionAttributeValues={
            ':aid': {
                'N': aid
            }
        },
        ScanIndexForward=False,
        Limit=1,
    )
    results.append(result['Items'])

print(json.dumps(results, indent=2))