不一致的结果与查询/扫描DynamoDB - 的NodeJS

问题描述:

我有一个DynamoDB表看起来像这样:不一致的结果与查询/扫描DynamoDB - 的NodeJS

enter image description here

(也有像150万个条目这样一个不同的时间戳)

我有2 GSI:

enter image description here

我试图检索表中的所有行对于给定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否则你得到了所有该键

这里的数据是引用:

About query limits

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); 
    } 
    });