如何获取 DynamoDB 表中的项目总数?

2022-08-30 15:35:57

我想知道我的动态表里有多少个项目。从API指南中,一种方法是使用扫描,如下所示:

<?php
$dynamodb = new AmazonDynamoDB();

$scan_response = $dynamodb->scan(array(
    'TableName' => 'ProductCatalog' 
));

echo "Total number of items: ".count($scan_response->body->Items)."\n";

但是,这必须获取所有项目并将其存储在内存中的数组中,这在大多数情况下都是不可行的。有没有办法更有效地获得总项目计数?

此数据在 AWS Dynamo Web 控制台中不可用,我已检查过。(起初,它看起来像是与分页按钮一起显示的,但事实证明,当您转到下一页的项目时,图形会增长)。


答案 1

我可以想到三个选项来获取 DynamoDB 表中的项目总数。

  1. 第一种选择是使用扫描,但扫描功能效率低下,通常是一种不好的做法,特别是对于具有大量读取的表或生产表。

  2. 第二个选项是阿塔尔瓦提到的:

    我想到的一个更好的解决方案是在单独的表中维护此类表的项目计数总数,其中每个项目都将具有表名称作为哈希键,并将该表中的项目总数作为非键属性。然后,您可以通过执行原子更新操作来递增/递减特定表的总项目计数,从而保持此表的更新可能名为“TotalNumberOfItemsPerTable”。

    唯一的问题是增量操作不是幂等的。因此,如果写入失败或您多次写入,这将反映在计数中。如果需要精确度,请改用条件更新。

  3. 最简单的解决方案是 DescribeTable,它返回 ItemCount。唯一的问题是计数不是最新的。计数每 6 小时更新一次。

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html


答案 2

该选项绝对是您想要的,但您还必须考虑到扫描结果中可能有一个或多个“页面”结果。扫描操作一次仅扫描表中的 1MB 数据,因此结果中的 值仅反映表的前 1MB 的计数。您需要使用结果中的 值(如果存在)发出后续请求。下面是一些用于执行类似操作的示例代码:CountCountLastEvaluatedKey

<?php

$dynamo_db = new AmazonDynamoDB();

$total = 0;
$start_key = null;
$params = array(
    'TableName' => 'my-table',
    'Count'     => true
);

do {
    if ($start_key) {
        $params['ExclusiveStartKey'] = $start_key->getArrayCopy();
    }

    $response = $dynamo_db->scan($params);

    if ($response->isOK()) {
        $total += (string) $response->body->Count;

        if ($response->body->LastEvaluatedKey) {
            $start_key = $response->body->LastEvaluatedKey->to_array();
        } else {
            $start_key = null;
        }
    }
} while ($start_key);

echo "Count: {$total}";

推荐