2017-02-08 80 views
0

我有一個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

回答

0

這是因爲默認情況下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

希望幫助

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); 
    } 
    }); 
相關問題