不一致的结果与查询/扫描DynamoDB - 的NodeJS
问题描述:
我有一个DynamoDB表看起来像这样:不一致的结果与查询/扫描DynamoDB - 的NodeJS
(也有像150万个条目这样一个不同的时间戳)
我有2 GSI:
我试图检索表中的所有行对于给定d唉。
这是我的代码看起来像(的NodeJS):
var AWS = require("aws-sdk");
AWS.config.update({accessKeyId: "", secretAccessKey: ""});
AWS.config.update({region: 'us-east-1'});
var docClient = new AWS.DynamoDB.DocumentClient();
var params = {
TableName: "QfGamingTransactionsProd",
IndexName: 'Result-RedeemedAt-index',
KeyConditionExpression: "#rs = :result and begins_with (#rat, :Rat)",
ExpressionAttributeNames: {
"#rs": "Result",
"#rat": "RedeemedAt"
},
ExpressionAttributeValues: {
":result": "SUCCESS",
":Rat": "2016-10-20"
}
};
docClient.query(params, function (err, data) {
if (err) {
console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
} else {
console.log("\nQuery succeeded. \n");
console.log("- Total", data.Count);
}
});
这似乎是工作,但我发现(方式)少的结果比预期的。这个相同的代码在较小的表上工作正常。
类似的结果扫描。
我缺少什么?
在此先感谢。
DV
答
这是因为默认情况下DynamoDB会在同一时间返回的数据只有1MB,但有解决这个问题的一种方式。
你需要改变你的实现像下面
第1步:呼叫DyanmoDB表,它将返回第一个1MB的数据,用这样它会返回"Next Evaluated Key"
第2步:呼叫Dynamodb表,但这次你通过"Next Evaluated Key"
在"Exclusive Start key"
得到新的一组数据
第3步:检查是否"Next Evaluated Key"
仍然可用,然后重复步骤2否则你得到了所有该键
这里的数据是引用:
Blog on how to implement this code
希望帮助
答
根据大小由于dynamodb具有查询(1MB)的大小限制,所以检索到的记录数量会发生变化。
在dynamodb中,查询将返回1Mb数据。 但我们可以通过分析结果。它可能会解决你的问题。 如果没有完全检索到满足该查询的数据,查询返回的数据将包含“LastEvaluateKey”。所以我们必须将“LastEvaluateKey”设置为“ExclusiveStartKey”。然后查询将检索剩余的数据。通过递归地遵循这个方法,我们将获得完整的数据。
var data = [];
async.until(function() {
return scanComplete;
},
function (callback) {
docClient.query(params, function (err, result) {
if (err) {
console.log(err);
} else {
data.push(result.Items);
if (typeof (result.LastEvaluatedKey) === 'undefined') {
scanComplete = true;
//fully retrieved
} else {
params.ExclusiveStartKey = result.LastEvaluatedKey;
}
if (!scanComplete) {
}
}
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);
reject(err);
} else {
resolve(data);
}
});