Skip to content

Instantly share code, notes, and snippets.

@nelsonic
Forked from deepanprabhu/gist:fbb406c3432c19eafe78a4b44e6a4b23
Last active April 26, 2021 17:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nelsonic/e227481c78b5cf7abcb53137ec3eb42b to your computer and use it in GitHub Desktop.
Save nelsonic/e227481c78b5cf7abcb53137ec3eb42b to your computer and use it in GitHub Desktop.
Concise Recursive DynamoDB Scan - Large Table - Using ExclusiveStartKey and LastEvaluatedKey - NodeJS
// Load the AWS SDK for JS
const AWS = require("aws-sdk");
// Set a region to interact with (make sure it's the same as the region of your table)
AWS.config.update({region: 'eu-west-2'});
// Set a table name that we can use later on
const tableName = "people"
// Create the Service interface for DynamoDB
const client = new AWS.DynamoDB({apiVersion: '2012-08-10'});
// Define the params we want to query Dynamo with
const params = {
TableName: tableName,
Limit: 50 // Configure based on typical document size
};
let aItems = [];
const recursiveScan = (params) => {
return client.scan(params).promise().then((data) => {
// Simple Changes to input, optional
let newItems = data.Items.map((item) => {
return item;
});
aItems = aItems.concat(newItems);
if(data.LastEvaluatedKey != null){
params.ExclusiveStartKey = data.LastEvaluatedKey;
// Recursive call, as deep as we can loop !
return recursiveScan(params);
}
return Promise.resolve(aItems);
}).then((items) => {
if(items != null && items.length != null)
console.log("Final List : " + items.length);
return items;
}).catch((error) => {
console.log(error);
console.log(JSON.stringify(error));
});
};
// invoke the recursiveScan function and log the result:
( async function() {
const items = await recursiveScan(params);
console.log(items.length);
console.log(JSON.stringify(items[0], null, 2));
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment