我有一个如下所示的DynamoDB表:
(有类似1500000个条目,具有不同的时间戳)
我有2个GSI:
我正在尝试检索表中给定日期的所有行。
这就是我的代码(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
答案 0 :(得分:0)
这是因为默认情况下,DynamoDB一次只返回1mb的数据,但有一种方法可以解决这个问题。
您需要更改您的实施,如下所示
第1步:调用DyanmoDB表,它将返回第1个1mb的数据,并返回System.out.println(allStates.indexOf(map.get("kansas")))
//or
String s = "kansas";
System.out.println(allStates.indexOf(map.get(s)))
第2步:再次调用Dynamodb表,但这次您在"Next Evaluated Key"
中传递"Next Evaluated Key"
以获取新的数据集
第3步:检查"Exclusive Start key"
是否仍然可用,然后重复步骤2,否则您获得该密钥的所有数据
以下是参考资料:
Blog on how to implement this code
希望有所帮助
答案 1 :(得分:0)
根据每条记录的大小,由于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);
}
});