Difference between revisions of "Dynamodb"

From John Freier
Jump to: navigation, search
Line 24: Line 24:
 
   var params = {
 
   var params = {
 
       TableName: "statements",
 
       TableName: "statements",
       AttributeDefinitions: [{
+
       AttributeDefinitions: [{     // Attributes are the items that are used in the key definitions and GSI/LSI.
 
               AttributeName: "id",
 
               AttributeName: "id",
               AttributeType: "S"
+
               AttributeType: "S"   // S - String
 
           },
 
           },
 
           {
 
           {
 
               AttributeName: "time",
 
               AttributeName: "time",
               AttributeType: "N"
+
               AttributeType: "N"   // N - Number
 
           },
 
           },
 
           {
 
           {
Line 58: Line 58:
 
           ],
 
           ],
 
           Projection: {
 
           Projection: {
               ProjectionType: 'ALL'
+
               ProjectionType: 'ALL'   // KEY_ONLY, INCLUDE, ALL - This holds the columns that are used in the GSI and returned when queried.
 
           },
 
           },
 
           ProvisionedThroughput: {
 
           ProvisionedThroughput: {
Line 81: Line 81:
 
Example query
 
Example query
 
     this.findLatest = async function(table, userId) {
 
     this.findLatest = async function(table, userId) {
        console.log('userId:' + userId + ' table:' + table);
 
 
         var params = {
 
         var params = {
 
             TableName: table,
 
             TableName: table,
             IndexName: 'statement_user_index',
+
             IndexName: 'statement_user_index',     // Must have the indexName too query against an GSI index.
             KeyConditionExpression: 'userId = :userId',
+
             KeyConditionExpression: 'userId = :userId',   // Must contain the key
             ExpressionAttributeValues: { ':userId': userId },
+
             ExpressionAttributeValues: { ':userId': userId }, // Used like prepared statements.
             Limit: 1,
+
             Limit: 1, // Number of results returned (optional)
             ScanIndexForward: false
+
             ScanIndexForward: false // Ascending or Descending. (Optional)
 
         };
 
         };
 
         try {
 
         try {
 
             const results = await docClient.query(params).promise();
 
             const results = await docClient.query(params).promise();
            console.log('Find latest ', results);
 
 
             return results.Items;
 
             return results.Items;
 
         } catch (err) {
 
         } catch (err) {

Revision as of 13:03, 5 January 2023

DynamoDB is an AWS product that has a stand alone app for development but is really suppose to be built out in AWS where they handle the administration/OPS.

This is a NoSQL database.

Partition Key and Sort Key

There are two types of keys that can be used to define a primary key.

Partition keys are the how the database separates data in the backend.

Sort keys allow you to sort data by a secondary column.

If more sorting is required, take a look at using Local Global Index.

Secondary Global Index

This allows you to create a super table from the base table, to allow for different keys and sorting when using the `query` command.

Example

 var AWS = require("aws-sdk");
 AWS.config.update({
     region: "local",
     endpoint: "http://localhost:8000"
 });
 var dynamodb = new AWS.DynamoDB();
 var params = {
     TableName: "statements",
     AttributeDefinitions: [{     // Attributes are the items that are used in the key definitions and GSI/LSI.
             AttributeName: "id",
             AttributeType: "S"   // S - String
         },
         {
             AttributeName: "time",
             AttributeType: "N"   // N - Number
         },
         {
             AttributeName: "userId",
             AttributeType: "S"
         }
     ],
     KeySchema: [{
             AttributeName: "id",
             KeyType: "HASH"
         }, //Partition key
         {
             AttributeName: "userId",
             KeyType: "RANGE"
         }, //Sort key 
     ],
     GlobalSecondaryIndexes: [{
         IndexName: 'statement_user_index',
         KeySchema: [{
                 AttributeName: 'userId',
                 KeyType: 'HASH',
             },
             {
                 AttributeName: 'time',
                 KeyType: 'RANGE',
             }
         ],
         Projection: {
             ProjectionType: 'ALL'    // KEY_ONLY, INCLUDE, ALL - This holds the columns that are used in the GSI and returned when queried.
         },
         ProvisionedThroughput: {
             WriteCapacityUnits: 5,
             ReadCapacityUnits: 5
         }
     }],
     ProvisionedThroughput: {
         ReadCapacityUnits: 5,
         WriteCapacityUnits: 5
     }
 };
 dynamodb.createTable(params, function(err, data) {
     if (err) {
         console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
     } else {
         console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
     }
 });


Example query

   this.findLatest = async function(table, userId) {
       var params = {
           TableName: table,
           IndexName: 'statement_user_index',     // Must have the indexName too query against an GSI index.
           KeyConditionExpression: 'userId = :userId',   // Must contain the key
           ExpressionAttributeValues: { ':userId': userId },  // Used like prepared statements.
           Limit: 1,  // Number of results returned (optional)
           ScanIndexForward: false  // Ascending or Descending. (Optional)
       };
       try {
           const results = await docClient.query(params).promise();
           return results.Items;
       } catch (err) {
           console.log(err);
           throw err;
       };
   }


Local Global Index

Local global index, creates a super table on top of the base table to allow for more sorting abilities.