5

我的 Dynamo Db 中有 450 万条记录。

我想批量读取每条记录的 id。

我期待诸如偏移和限制之类的东西,例如我们如何在 Mongo Db 中阅读。

Node-JS中有没有没有扫描方法的建议。

我已经做了足够的研究,我只能找到从 Dynamo Db 缓冲完整记录并开始扫描记录的扫描方法,这在性能基础上无效。

请给我建议。

4

2 回答 2

3

从我的角度来看,进行扫描没有问题,因为(根据Scan doc):

  • DynamoDB 对 Scan 操作的结果进行分页

  • 您可以使用 ProjectionExpression 参数,以便 Scan 仅返回一些属性,而不是所有属性

页面的默认大小为 1MB,但您也可以使用参数指定每页的最大项目数Limit

所以这只是基本的分页,和 MongoDB 对offsetand所做的一样limit

是文档中有关如何使用node.jsSDK 执行扫描的示例。

现在,如果您想批量获取所有 ID,您可以使用 a 包装整个内容,Promise并在没有LastEvaluatedKey.

下面是你可以做什么的伪代码:

const performScan = () => new Promise((resolve, reject) => {
    const docClient = new AWS.DynamoDB.DocumentClient();
    let params = {
        TableName:"YOUR_TABLE_NAME",
        ProjectionExpression: "id",
        Limit: 100 // only if you want something else that the default 1MB. 100 means 100 items
    };
    let items = [];

    var scanExecute = cb => {
        docClient.scan(params, (err,result) => {
            if(err) return reject(err);

            items = items.concat(result.Items);
            if(result.LastEvaluatedKey) {
                params.ExclusiveStartKey = result.LastEvaluatedKey;
                return scanExecute();
            } else {
                return err
                    ? reject(err)
                    : resolve(items);
            }
        });
    };
    scanExecute();
});

performScan().then(items => {
    // deal with it
});
于 2018-02-15T12:13:44.297 回答
2

首先要了解 DynamoDB 是它是一个支持二级索引的键值对存储。

如果应用程序经常不得不在不使用索引(主索引或辅助索引)的情况下迭代整个数据集,那么 DynamoDB 是一个糟糕的选择,因为这样做的唯一方法是使用ScanAPI。

DynamoDB 表扫描是(我能想到的一些事情)

  1. 贵(我的意思是$$$)
  2. 大数据集慢
  3. 可能会用完预置的吞吐量

如果您知道 DynamoDB 中所有项目的主键(一些外部知识,如主要是一个自动递增的值,在另一个数据库中引用等),那么您可以使用BatchGetItemQuery.

因此,如果它是一次性的,那么这Scan是您唯一的选择,否则您应该考虑重构您的应用程序以消除这种情况。

于 2018-02-22T02:04:18.920 回答