因AWS并没有提供mongodb的云服务。所以需要将数据库从mongodb切换到AWS 的dynamodb。
Dynamodb 提供了本地调试版本,本文主要介绍dynamodb本地调试使用。

数据库环境:Linux(Dynamodb环境)
server环境:AWS SDK
server端语言: nodejs(ubuntu)

文章目录

  • 1 Dynamodb 基本概念
    • 1.1 DynamoDB 基本结构
    • 1.2 DynamoDB中主键的概念
  • 2 部署DynamoDB到本地服务器
  • 3 测试DynamoDB
    • 3.1 创建表
    • 3.2 增加
    • 3.3 读取
    • 3.4 更新
    • 3.5 删除
      • 3.5.1 删除item 中的属性
  • 4 一段辅助调试的code

1 Dynamodb 基本概念

Amazon DynamoDB是一款完全托管的NoSQL数据库服务,可提供快速,可预测的性能和无缝可扩展性。

1.1 DynamoDB 基本结构

DynamoDB 几个概念:tables, items, and attributes。(表,项目和属性)
Table是一个item集合, 每个item又是attributes集合。可以对应理解为mongodb中 集合 文档 属性。
例: People表中的某个项目包含名为PersonID,LastName, FirstName等的属性。

1.2 DynamoDB中主键的概念

DynamoDB不像mongodb默认情况下会生成_id来唯一标识某条数据。所以在DynamoDB中就有了主键的概念。
指定表的主键。主键唯一标识表中的每个项目。(指定某个属性为主键)

DynamoDB支持两种不同的主键:
1 分区键
DynamoDB使用分区键的值作为内部散列函数的输入。散列函数的输出确定项目将存储在其中的分区(DynamoDB内部的物理存储)。
2 复合主键(分区键和排序键)
DynamoDB使用分区键值作为内部散列函数的输入。散列函数的输出确定项目将存储在其中的分区(DynamoDB内部的物理存储)。所有具有相同分区键的项目都按照排序键值存储在一起。
在具有分区键和排序键的表中,有可能两个项具有相同的分区键值。但是,这两个项目必须具有不同的排序键值。
PS:这里我们实际使用上遇到了一个问题,在分区间不同的情况下,确保某个属性唯一还没有找到比较好的方法。

2 部署DynamoDB到本地服务器

1 下载并解压DynamoDB code
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBLocal.html
将code 放到linux 服务器上解压

2 安装Java运行环境(apt 大法)

3 在dynamodb 目录下运行(默认为8000端口)

java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb

PS:本地DynamoDb 也不提供图形管理界面

3 测试DynamoDB

以下代码均基于nodejs 的AWS SDK.代码来自官方文档,个人做了相应注释,第一次运行代码可能需要配置AWS身份认证。

官方文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.NodeJs.html
API文档 : https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html

新建一个文件夹:安装AWS-SDK

npm install aws-sdk

以下操作均基于主键。

3.1 创建表

var AWS = require("aws-sdk");
AWS.config.update({region: "us-west-2",                          //使用哪个区域的aws服务endpoint: "http://localhost:8000" //dynamodb位置
});
var dynamodb = new AWS.DynamoDB();var params = {TableName : "Movies",//表名KeySchema: [       //主键{ AttributeName: "year", KeyType: "HASH"},  //Partition key 分区键{ AttributeName: "title", KeyType: "RANGE" }  //Sort key    排序键],AttributeDefinitions: [//主键数据类型    { AttributeName: "year", AttributeType: "N" },//N Number{ AttributeName: "title", AttributeType: "S" }   //S String],ProvisionedThroughput: { //DynamoDB吞吐量配置ReadCapacityUnits: 10, WriteCapacityUnits: 10}
};
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));}
});

3.2 增加

var docClient = new AWS.DynamoDB.DocumentClient();var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
var params = {TableName:table,//要操作的表名Item:{"year": year,//主键-分区间"title": title,//主键-排序键"info":{     //其他属性"plot": "Nothing happens at all.","rating": 0}}
};
console.log("Adding a new item...");
docClient.put(params, function(err, data) {if (err) {console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));} else {console.log("Added item:", JSON.stringify(data, null, 2));}
});

3.3 读取

var docClient = new AWS.DynamoDB.DocumentClient()
var table = "Movies";//表名必须填
var year = 2015;  //待查询的分区键
var title = "The Big New Movie";//待查询的排序键   如果表建立时设置为复合主键的话,仅通过分区键既可查询到所有分区键相同排序键不同的项
var params = {TableName: table,Key:{"year": year,"title": title}
};
docClient.get(params, function(err, data) {if (err) {console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));} else {console.log("GetItem succeeded:", JSON.stringify(data, null, 2));}
});

3.4 更新

您可以使用该update方法修改现有项目。您可以更新现有属性的值,添加新属性或删除属性。

var table = "Movies";
var year = 2015;
var title = "The Big New Movie";
// Update the item, unconditionally,
var params = {TableName:table,Key:{"year": year,//分区键"title": title//排序键   主键在update接口必须},UpdateExpression: "set info.rating = :r, info.plot=:p, info.actors=:a",//想要改变值的表达式ExpressionAttributeValues:{      //为想要改变的值赋值 ":r":5.5,":p":"Everything happens all at once.",":a":["Larry", "Moe", "Curly"]},ReturnValues:"UPDATED_NEW"//返回更新值,即下中data
};
console.log("Updating the item...");
docClient.update(params, function(err, data) {console.log(data);if (err) {console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));} else {console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));}
});

该程序用UpdateExpression描述您要对指定项目执行的所有更新。
该ReturnValues参数指示DynamoDB仅返回更新的属性(“UPDATED_NEW”)。
所有以#开头的表示属性名变量;以:开头的表示属性值变量

3.5 删除

通过主键删除表中的单个项目。您可以执行条件删除操作,
条件删除仅适用于在满足特定条件的情况下删除项目。如果满足这些条件,DynamoDB将执行删除操作。否则,该项目不会被删除。
[2018/12/07]最近需要将某个分区键下的所有item删掉,才发现文档中有这么一句,真的是难受:
对于主键,您必须提供所有属性。例如,使用简单的主键,您只需要为分区键提供值。对于复合主键,必须为分区键和排序键提供值。也就是不支持只提供分区键进行批量删除,必须分区键和排序键均提供。

var table = "Movies";
var year = 2015;
var title = "The Big New Movie";var params = {TableName:table,//待删除操作的表Key:{"year":year,//分区键"title":title//排序键},ConditionExpression:"info.rating <= :val",//删除条件表达式ExpressionAttributeValues: {":val": 5.0   //条件值 }
};
console.log("Attempting a conditional delete...");
docClient.delete(params, function(err, data) {if (err) {console.error("Unable to delete item. Error JSON:", JSON.stringify(err, null, 2));} else {console.log("DeleteItem succeeded:", JSON.stringify(data, null, 2));}
});

以上代码将会执行失败因为不满住条件将
“:val”: 5.0 改为":val": 6.0 即可成功

具体更实践用法(query index …)将在下篇blog中说明。

3.5.1 删除item 中的属性

       let params = {};params.Key = {"year":year,//分区键"title":title//排序键},params.TableName = table,//待删除操作的表;params.ReturnConsumedCapacity = "TOTAL";params.ReturnValues = "ALL_NEW";params.UpdateExpression = "REMOVE date";//删除date属性dynamodb.update(params, function(err, data) {if (err) {logger.error("updateItem:", JSON.stringify(params));logger.error(err);callback (err);}else {callback (null, data);}});

4 一段辅助调试的code

用于遍历表 删除表 查看DynamoDB所有表

var AWS = require("aws-sdk");
let Instructions =`
*******使用说明***********
node demo.js scanall 表名
node demo.js listtables
node demo.js delete 表名
*******使用说明***********`
console.log(Instructions);AWS.config.update({region: "us-west-1",endpoint: "http://localhost:8000"
});
var dynamodb = new AWS.DynamoDB();
var docClient = new AWS.DynamoDB.DocumentClient();
var arguments = process.argv.splice(2);
console.log('所传递的参数是:', arguments);if(arguments[0]  === "delete")
{let TableName = arguments[1];var params = {TableName: TableName};dynamodb.deleteTable(params, function(err, data) {if (err) console.log(err, err.stack); // an error occurredelse     console.log(data);           // successful response});
}
else if (arguments[0] === "scanall") {var params = {};params.TableName = arguments[1] ? arguments[1] : "users";console.log(JSON.stringify(params));dynamodb.scan(params, function (err, data) {if (err) console.log(err, err.stack); // an error occurredelse {for (var info in data.Items) {console.log("{");for (var key in data.Items[info]) {console.log("  ", key, ": ", JSON.stringify(data.Items[info][key]));}console.log("}");}}});
}
else if(arguments[0]  === "listtables")
{dynamodb.listTables(function (err, data) {console.log('listTables:', data.TableNames);});
}
else {console.error("operate only support delete scanall listtables");
}

AWS DynamoDB基础使用相关推荐

  1. AWS DynamoDB 常用操作

    在上篇blog 简单介绍了 DynamoDB 初步使用.但DynamoDb实际上使用与mongodb 有很大差异,这里自己用到一些操作方式(查询 更新 批量删除)做一些说明. 所有操作均基于:node ...

  2. aws dynamodb_使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

    aws dynamodb 将任何实体上的版本属性保存到 AWS DynamoDB数据库,它只是表示已修改实体次数的数字表示. 首次创建实体时,可以将其设置为1,然后在每次更新时递增. 好处是立竿见影的 ...

  3. aws dynamodb_带有AWS DynamoDB的React式Spring Webflux

    aws dynamodb AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO. 在本文中,我将探讨如何使用AWS开发工具包2.x的Dyn ...

  4. 使用适用于Java 2的AWS开发工具包的AWS DynamoDB版本字段

    将任何实体上的版本属性保存到 AWS DynamoDB数据库,它仅是表示实体已修改次数的数字表示. 首次创建实体时,可以将其设置为1,然后在每次更新时递增. 好处是立竿见影的-指示实体已被修改的次数, ...

  5. Dynamodb基础操作

    https://docs.aws.amazon.com/cli/latest/reference/dynamodb/index.html#cli-aws-dynamodb 假设有一张表名为 test_ ...

  6. aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作

    总结一下 dynamodb通常和java等后端sdk结合使用 使用的形式可以是api或partiql语法调用 dynamodb的用法不难,更重要的是维护成本,所需的服务集成,技术选型等 和大数据结合场 ...

  7. AWS云计算基础习题(含答案)

    模块1: 相比本地计算,云计算的优势哪些?避免大额购买:使用按需容量:数分钟内实现全球化部署:提高速度和敏捷性. 哪种定价模型可使 AWS 用户能够按需为资源付费?按实际使用量付费 哪项不是云部署模型 ...

  8. aws DynamoDB 读/写容量模式

    亚马逊DynamoDB有两种读/写能力模式,用于处理对你的表的读和写. 1.随需应变 2.供给(默认,符合自由层条件) 读/写容量模式控制你如何对读和写的吞吐量收费,以及如何管理容量.你可以在创建表的 ...

  9. 带有AWS DynamoDB的反应式Spring Webflux

    AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO. 在本文中,我将探讨如何使用AWS开发工具包2.x的DynamoDB API以及如何 ...

最新文章

  1. Commonjs规范
  2. 机器人动力学方程的性质
  3. jdk和tomcat配置
  4. php 和mysql实现抢购功能_php处理抢购类功能的高并发请求
  5. 看门狗(Watch Dog)是嵌入式系统中一种常用的保证系统可靠性的技术,()会产生看门狗中断。【详细!小白也能看懂!】
  6. leetcode1050. 合作过至少三次的演员和导演(SQL)
  7. 船舶定位实时查询系统_港口人员精准定位系统,实时安全管控与智能预警
  8. 简述HTML5的概念和组成结构,JS相关概念
  9. 交易系统典藏书籍总汇以及系统交易、程序化交易等经典资料收藏
  10. java default修饰符_Java学习笔记--- 变量类型,修饰符
  11. cudnn下载与安装
  12. 制作.rpgsave存档修改器
  13. 穿越计算机的迷雾--读书笔记三
  14. 【图像融合】可见光与红外图像融合方法和评价指标
  15. 电脑软件故障排除2014年2月16日[不断改进修正版]
  16. 蓝蓝的天空上飘着白云,白云的下面藏着雪白的羊群 ---- 刘烨
  17. 阿里妈妈展示广告引擎新探索:迈向全局最优算力分配
  18. java新手抖机灵(java新手技巧)
  19. 上海东方美谷JW万豪、福清喜来登、宁波杭州湾凯悦等酒店开业 | 中国酒店周刊...
  20. python爬虫学习(2) —— 爬一下ZOL壁纸

热门文章

  1. 叮咚买菜拟赴美上市 官网域名为杂米域名100.me
  2. 天津大学大作业管理概论答案
  3. 数据分析——R语言中ggplot2用法(1)
  4. 怎样将语音转化为文字
  5. 关于Catalan(卡特兰)数的理解
  6. OC7141 PWM 调光的线性降压 LED 恒流驱动器
  7. 读书笔记:《C++ PrimerPlus》 第九章~第十一章
  8. 无线物联网技术,在智能门禁系统的应用
  9. python关键字输出
  10. 风吹雪支付系统易支付去后台验证版本代理系统