referernce:
https://www.codementor.io/devops/tutorial/handling-date-and-datetime-in-dynamodb
Dynamo Db does not support multiple indexes
It supports only Hash key, hash key + range key only
Does not support native date, DateTime object
Advantage:
No worries of scaling, monitoring, security updates.
average good response.
Use unix time stamp, store as Number
Combine multiple mongo db key if required
Database denormalization
Based on query patter, create schema
Dynamo DB is NO SQL db
Queries are slow
GetItem call as fast
Terminology
Table , Item, Attribute, Primary Key, hash attribute value, hash and range attribute values
secondary index on non key attibute value
Start the dynamo db locally
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -help
Dynamo db port: 8000
Create table
var params = {
TableName : "Music",
KeySchema:[
{AttributeName:"Artist", KeyType:"Hash"},
{AttributeName:"SongTitle", KeyType:"Range"}
],
AttributeDefinitions:[
{AttibuteName:"Artist", AttibuteType:"S"},
{AttibuteName:"SongTitle", AttibuteType:"S"},
],
ProvisionedThroughput:{
ReadCapacityUnits:1,
WriteCapacityUnits: 1
}
};
dynamodb.createTable(params, function(err, data){
});
TableStatus is should be Active
2)
var params = {
TableName: "Music"
};
dynamodb.describeTable(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
3)
var params = {};
dynamodb.listTables(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
4)
var params = {
TableName: "Music",
Item: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today",
"AlbumTitle":"Somewhat Famous",
"Year": 2015,
"Price": 2.14,
"Genre": "Country",
"Tags": {
"Composers": [
"Smith",
"Jones",
"Davis"
],
"LengthInSeconds": 214
}
}
};
dynamodb.putItem(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
primarykey is must, remaining attribute are optional
5)Condition Expressoin
var params = {
TableName: "Music",
Item: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today",
"AlbumTitle":"Somewhat Famous",
"Year": 2015,
"Price": 2.14,
"Genre": "Country",
"Tags": {
"Composers": [
"Smith",
"Jones",
"Davis"
],
"LengthInSeconds": 214
}
},
"ConditionExpression": "attribute_not_exists(Artist) and attribute_not_exists(SongTitle)"
};
6)Batch insert
var params = {
RequestItems: {
"Music": [
{
PutRequest: {
Item: {
"Artist": "No One You Know",
"SongTitle": "My Dog Spot",
"AlbumTitle":"Hey Now",
"Price": 1.98,
"Genre": "Country",
"CriticRating": 8.4
}
}
},
{
PutRequest: {
Item: {
"Artist": "No One You Know",
"SongTitle": "Somewhere Down The Road",
"AlbumTitle":"Somewhat Famous",
"Genre": "Country",
"CriticRating": 8.4,
"Year": 1984
}
}
}
]}
7)Dynamo db data types
String, number, float, map, list
8)
var params = {
TableName: "Music",
Key: {
"Artist": "No One You Know",
"SongTitle": "Call Me Today"
}
};
dynamodb.getItem(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
9)
var params = {
TableName: "Music",
Key: {
"Artist": "No One You Know",
"SongTitle": "Call Me Today"
},
ProjectionExpression: "AlbumTitle"
};
10)
var params = {
TableName: "Music",
KeyConditionExpression: "Artist = :artist",
ExpressionAttributeValues: {
":artist": "No One You Know"
}
};
dynamodb.query(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
11)
var params = {
TableName: "Music"
};
dynamodb.scan(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
Operations
12)
var params = {
TableName: "Music",
AttributeDefinitions:[
{AttributeName: "Genre", AttributeType: "S"},
{AttributeName: "Price", AttributeType: "N"}
],
GlobalSecondaryIndexUpdates: [
{
Create: {
IndexName: "GenreAndPriceIndex",
KeySchema: [
{AttributeName: "Genre", KeyType: "HASH"},
{AttributeName: "Price", KeyType: "RANGE"},
],
Projection: {
"ProjectionType": "ALL"
},
ProvisionedThroughput: {
"ReadCapacityUnits": 1,"WriteCapacityUnits": 1
}
}
}
]
};
dynamodb.updateTable(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
13)
var params = {
TableName: "Music",
Key: {
"Artist":"No One You Know",
"SongTitle":"Call Me Today"
},
UpdateExpression: "SET RecordLabel = :label",
ExpressionAttributeValues: {
":label": "Global Records"
},
ReturnValues: "ALL_NEW"
};
dynamodb.updateItem(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
15)Automatic counter
15)
var params = {
TableName: "Music",
Key: {
Artist: "The Acme Band",
SongTitle: "Look Out, World"
}
};
dynamodb.deleteItem(params, function(err, data) {
if (err)
console.log(JSON.stringify(err, null, 2));
else
console.log(JSON.stringify(data, null, 2));
});
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BestPractices.html
refernce:
http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Java.html