我的 Dynamo Db 中有 450 万条记录。
我想批量读取每条记录的 id。
我期待诸如偏移和限制之类的东西,例如我们如何在 Mongo Db 中阅读。
Node-JS中有没有没有扫描方法的建议。
我已经做了足够的研究,我只能找到从 Dynamo Db 缓冲完整记录并开始扫描记录的扫描方法,这在性能基础上无效。
请给我建议。
我的 Dynamo Db 中有 450 万条记录。
我想批量读取每条记录的 id。
我期待诸如偏移和限制之类的东西,例如我们如何在 Mongo Db 中阅读。
Node-JS中有没有没有扫描方法的建议。
我已经做了足够的研究,我只能找到从 Dynamo Db 缓冲完整记录并开始扫描记录的扫描方法,这在性能基础上无效。
请给我建议。
从我的角度来看,进行扫描没有问题,因为(根据Scan doc):
DynamoDB 对 Scan 操作的结果进行分页
您可以使用 ProjectionExpression 参数,以便 Scan 仅返回一些属性,而不是所有属性
页面的默认大小为 1MB,但您也可以使用参数指定每页的最大项目数Limit
。
所以这只是基本的分页,和 MongoDB 对offset
and所做的一样limit
。
这是文档中有关如何使用node.js
SDK 执行扫描的示例。
现在,如果您想批量获取所有 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
});
首先要了解 DynamoDB 是它是一个支持二级索引的键值对存储。
如果应用程序经常不得不在不使用索引(主索引或辅助索引)的情况下迭代整个数据集,那么 DynamoDB 是一个糟糕的选择,因为这样做的唯一方法是使用Scan
API。
DynamoDB 表扫描是(我能想到的一些事情)
如果您知道 DynamoDB 中所有项目的主键(一些外部知识,如主要是一个自动递增的值,在另一个数据库中引用等),那么您可以使用BatchGetItem
或Query
.
因此,如果它是一次性的,那么这Scan
是您唯一的选择,否则您应该考虑重构您的应用程序以消除这种情况。