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

Tom*_*Tom 21 php amazon-dynamodb

我想知道我的dynamodb表中有多少项.从API指南中,一种方法是使用如下扫描:

<?php
$dynamodb = new AmazonDynamoDB();

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

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

但是,这必须获取所有项目并将它们存储在内存中的数组中,这在我认为的大多数情况下是不可行的.有没有办法更有效地获得总项目数?

我已经检查过AWS Dynamo Web控制台中没有此数据.(起初看起来它显示在分页按钮旁边,但事实证明,当你转到下一页的项目时,数字会增长).

Han*_*nny 23

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

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

  2. 第二种选择是Atharva提到的:

    我想到的一个更好的解决方案是在单独的表中维护这些表的项目计数总数,其中每个项目都有表名作为它的散列键和该表中的项目总数,因为它是非键属性.然后,您可以通过使原子更新操作增加/减少特定表的总项数来更新此表可能名为"TotalNumberOfItemsPerTable".

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

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

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


Jer*_*lom 13

Count选项绝对是您想要的,但您还必须考虑扫描结果中可能有一个或多个"页面"结果.扫描操作一次只扫描表中的1MB数据,因此Count结果中的值仅反映表的前1MB的计数.您需要使用结果中的值LastEvaluatedKey(如果存在)来进行后续请求.这是一些用于执行此类操作的示例代码:

<?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}";
Run Code Online (Sandbox Code Playgroud)


Tom*_*Tom 6

Aha,API中有一个Count选项scan,请参阅http://docs.amazonwebservices.com/AWSSDKforPHP/latest/#m=AmazonDynamoDB/scan

<?php
$dynamodb = new DynamoMetadata();

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

echo "Count: ".$scan_response->body->Count."\n";
Run Code Online (Sandbox Code Playgroud)

  • 正如Jeremy Lindblom在他的回答中所提到的那样:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html确保你处理1MB的限制,即返回的数量可以是如果您的表格大小超过1MB,则计算部分计数. (2认同)

Ath*_*rva 5

如果您对在应用程序逻辑中使用表中的项目总数感兴趣,这意味着您将非常频繁地查询总数。现在实现这一目标的一种方法是使用扫描操作。但是请记住,扫描操作实际上是扫描整个表,因此会消耗大量吞吐量,因此所有查询操作都会在此期间收到 Throttled Exception。即使考虑到 scan 会将结果计数限制为 1MB 的大小,如果表非常大,您将不得不进行重复扫描操作以获取实际项目数。这将需要编写自定义查询逻辑并处理查询操作中不可避免的限制。

我想到的一个更好的解决方案是在一个单独的表中维护此类表的项目总数,其中每个项目将表名称作为它的散列键和该表中项目的总数作为它的非键属性. 然后,您可以通过进行原子更新操作来增加/减少特定表的总项目数,从而使这个可能名为“TotalNumberOfItemsPerTable”的表保持更新。

没有节流或 1MB 限制的问题。

此外,您可以将此概念扩展到更进一步的粒度,例如维护与某些哈希键或任何任意条件匹配的项目总数,您可以将其编码为字符串形式以在表中创建一个名为“TotalNumberOfItemsInSomeCollection”或“的条目” TotalNumberOfItemsMatchingSomeCriteria”。然后,这些表可以包含每个表、每个集合的项目数或与某些条件匹配的项目的条目。