Difference between revisions of "Dynamodb"
From John Freier
| 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) { | ||
| − | |||
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(); | ||
| − | |||
return results.Items; | return results.Items; | ||
} catch (err) { | } catch (err) { | ||
Revision as of 12: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.