【问题标题】:Error scanning DynamoDB table扫描 DynamoDB 表时出错
【发布时间】:2016-08-23 01:38:22
【问题描述】:

我有以下代码扫描 DynamoDB 表并返回具有键值 test = true 的人数的计数。由于某种原因,此代码没有扫描整个表。有谁知道为什么?

var aws         = require('aws-sdk');
var config      = require('./config.js');

aws.config.update({accessKeyId: config.key, secretAccessKey: config.secret});
aws.config.update({region: 'us-east-1'});

function getItems() {
    var db = new aws.DynamoDB.DocumentClient();
    db.scan({
        TableName : config.db,
    }, function(err, data) {
        if (err) { console.log(err); return; }

        var count = 0;

        for (var ii in data.Items) {
            ii = data.Items[ii];
            if (ii.setRemoveBrandingEmailOptin) {
               console.log(ii.test);
               count += 1;
            }
        }
        console.log(count);
    });
}
getItems();

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    the documentation:

    如果扫描的项目总数超过最大数据集大小 限制为 1 MB,扫描停止并将结果返回给用户 一个 LastEvaluatedKey 值,用于在后续的扫描中继续 手术。结果还包括超过 限制。

    无论如何,您都不需要将整个表转储到您的应用程序中进行简单计数。您正在以最低效的方式执行此操作。试试这样的:

    db.scan({
            TableName : config.db,
            Select: 'COUNT',
            FilterExpression: "#emailOptInField = :emailOptInValue",
            ExpressionAttributeNames: {
              "#emailOptInField": "setRemoveBrandingEmailOptin",
            },
            ExpressionAttributeValues: {
              ":emailOptInValue": true
            }
        }, function(err, data) {
        if (err) { console.log(err); return; }
    
        var count = data.Count;
        console.log(count);
    });
    

    【讨论】:

    • 如何使用 LastEvaluatedKey 获取下一组项目?
    • @Jasmine 查看我的更新以获得更好的方法。不过总的来说,您真的应该花时间阅读文档。
    • 我的数据库的读取速度为 100/秒,超过 500k 行
    猜你喜欢
    • 2018-01-10
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多