How to fetch/scan all items from `AWS dynamodb` using node.js
This is working for me:
export const scanTable = async (tableName) => { const params = { TableName: tableName, }; const scanResults = []; const items; do{ items = await documentClient.scan(params).promise(); items.Items.forEach((item) => scanResults.push(item)); params.ExclusiveStartKey = items.LastEvaluatedKey; }while(typeof items.LastEvaluatedKey !== "undefined"); return scanResults;};
If you would like to get the data from DynamoDB without using Hash key value, you need to use Scan API
.
Note: The Scan API reads all the items in the table to get the results. So, it is a costly operation in DynamoDB.
Alternate Approach : Use GSI
Scan Code for the above sceanario:-
var docClient = new AWS.DynamoDB.DocumentClient();var params = { TableName: "users", FilterExpression: "#user_status = :user_status_val", ExpressionAttributeNames: { "#user_status": "user_status", }, ExpressionAttributeValues: { ":user_status_val": 'somestatus' }};docClient.scan(params, onScan);var count = 0;function onScan(err, data) { if (err) { console.error("Unable to scan the table. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("Scan succeeded."); data.Items.forEach(function(itemdata) { console.log("Item :", ++count,JSON.stringify(itemdata)); }); // continue scanning if we have more items if (typeof data.LastEvaluatedKey != "undefined") { console.log("Scanning for more..."); params.ExclusiveStartKey = data.LastEvaluatedKey; docClient.scan(params, onScan); } }}
AWS documentation example didn't work for me. @Hank approach did the trick.
Using handler inside a lambda:
const AWS = require('aws-sdk');const docClient = new AWS.DynamoDB.DocumentClient({ // optional tuning - 50% faster(cold) / 20% faster(hot) apiVersion: '2012-08-10', sslEnabled: false, paramValidation: false, convertResponseTypes: false});const tableName = 'series';exports.handler = async (event, context, callback) => { let params = { TableName: tableName }; let scanResults = []; let items; do { items = await docClient.scan(params).promise(); items.Items.forEach((item) => scanResults.push(item)); params.ExclusiveStartKey = items.LastEvaluatedKey; } while (typeof items.LastEvaluatedKey != "undefined"); callback(null, scanResults);};