1

在我的应用程序中,我将 node.js 与亚马逊网络服务 dynamoDB 一起使用。我已经创建了一个表并在其上插入了项目。现在我想使用 describeTable 显示我的表的项目数。我该怎么做。我在下面尝试代码,但它不工作。

     var AWS = require('aws-sdk');
     AWS.config.update({accessKeyId: '****', secretAccessKey:  '****',region: 'us-east-1'});
     var svc = new AWS.DynamoDB();
     svc.client.describeTable({TableName:"Users"}, function(err,result) {
     if(!err){

        console.log('result is '+result[ItemCount]);
         console.log('success');
     }
   else{

    console.log("err is "+err);
    }
   });
4

3 回答 3

3

您的问题的直接答案是您需要在回调函数中使用 result.Table.ItemCount 而不是 result.ItemCount。但是请注意,此计数不会实时更新,并且可能不会反映最近对表的插入或删除。如果您想要当前项目计数,则需要扫描表并使用 Count 属性来获取扫描项目的计数。像这样的扫描可能会消耗您为表配置的所有容量,因此如果这是一项要求,请务必平衡对最近项目计数的需求与可能同时在表上运行的其他操作。

这是返回项目计数的扫描的 node.js 示例。由于扫描被迭代调用,直到所有行都被读取,我使用异步模块在发出下一个循环之前等待结果。

var async = require('async');
var AWS = require('aws-sdk');

AWS.config.update({accessKeyId: 'AKID',
                   secretAccessKey:  'secret',
                   region: 'us-east-1'});
var svc = new AWS.DynamoDB();

var scanComplete = false,
    itemCountTotal = 0,
    consumedCapacityUnitsTotal = 0;

var scanParams = { TableName : 'usertable',
                   Count : 'true' };

// scan is called iteratively until all rows have been scanned
//  this uses the asyc module to wait for each call to complete
//  before issuing the next.
async.until( function() { return scanComplete; },
             function (callback) {
                svc.scan(scanParams, function (err, result) {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log(result);
                        if (typeof (result.LastEvaluatedKey) === 'undefined' ) {
                            scanComplete = true;
                        } else {
                            // set the start key for the next scan to our last key
                            scanParams.ExclusiveStartKey = result.LastEvaluatedKey;
                        }
                        itemCountTotal += result.Count;
                        consumedCapacityUnitsTotal += result.ConsumedCapacityUnits;
                        if (!scanComplete) {
                            console.log("cumulative itemCount " + itemCountTotal);
                            console.log("cumulative capacity units " + consumedCapacityUnitsTotal);
                        }
                    }
                    callback(err);
                });
             },
             // this runs when the loop is complete or returns an error
             function (err) {
                if (err) {
                    console.log('error in processing scan ');
                    console.log(err);
                } else {
                    console.log('scan complete')
                    console.log('Total items: ' + itemCountTotal);
                    console.log('Total capacity units consumed: ' + consumedCapacityUnitsTotal);
                }
             }
);
于 2013-03-22T19:30:49.127 回答
3

svc 后删除客户端。文档

var svc = new AWS.DynamoDB();
svc.describeTable(params, function(err, data) {
    if (err) {
       // error
    } else {
        var table = data['Table'];
        console.log(table['ItemCount']);
    }
});

这对我有用。

于 2016-05-31T09:43:30.587 回答
2

托德贝,

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#scan-property描述了具有Select参数的扫描参数,该参数可以具有值'COUNT' ...

Select —(字符串)要在结果中返回的属性。您可以检索所有项目属性、特定项目属性、匹配项目的计数,或者在索引的情况下,部分或全部属性投影到索引中。

COUNT:返回匹配项的数量,而不是匹配项本身。

因此,在您的示例中, scanParams 似乎应该是...

var scanParams = {
    TableName: 'usertable',
    Select: 'COUNT'
};
于 2013-12-03T15:12:44.620 回答