DynamoDb扫描返回本地但不是实时的所有数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDb扫描返回本地但不是实时的所有数据相关的知识,希望对你有一定的参考价值。
我使用递归调用来获取来自dynamodb的数据超过1 mb的数据
params.ConsistentRead = true;
let projectCollection = [];
dynamoDb.scan(params, onQuery);
function onQuery(err, data) {
const methodName = 'onQuery';
if (err) {
callback(err);
} else {
for (let i = 0; i < data.Items.length; i++) {
projectCollection.push(data.Items[i]);
}
if (typeof data.LastEvaluatedKey !== 'undefined') {
params.ExclusiveStartKey = data.LastEvaluatedKey;
dynamoDb.scan(params, onQuery);
} else {
callback(err, projectCollection); //recursive call
}
}
}
};
但我得到了我的本地主机上的数据但是一旦我在aws上部署它,其中调用通过管道API GATEWAY然后lambda然后是dynamodb,我的函数不返回所有数据而是一小块。
它是Cache问题吗?
答案
可能,但我认为您更有可能不按预期分页扫描结果。我认为最可能的解释是你只阅读第一页。
我不是nodejs人,但我注意到你使用的是严格的操作数:
typeof data.LastEvaluatedKey !== 'undefined'
你似乎正在对一个字符串应用测试,我认为该字符串将始终返回true。公平地说,我不认为这是你的根本问题,但你应该使用..?
typeof data.LastEvaluatedKey != 'undefined'
另一答案
我使用了QUERY,并根据需要更快地提供数据。
let items = [];
let queryExecute = function(callback) {
dynamoDb.query(params,function(err,result) {
if(err) {
callback(err);
} else {
items = items.concat(result.Items);
if(result.LastEvaluatedKey) {
params.ExclusiveStartKey = result.LastEvaluatedKey;
queryExecute(callback);
} else {
callback(err,items);
}
}
});
};
以上是关于DynamoDb扫描返回本地但不是实时的所有数据的主要内容,如果未能解决你的问题,请参考以下文章
使用 lambda 扫描/查询 dynamodb 表中的特定条目
如何使用 nodejs 使用 Dynamodb 并行扫描检索数据
AWS AppSync GraphQL - 如何使用 PK/SK 查询而不是扫描整个 dynamoDB 表以获取 graphql 列表 API