前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[ 后端篇 ] 06 - AWS DynamoDB 操作二三事

[ 后端篇 ] 06 - AWS DynamoDB 操作二三事

作者头像
程序手艺人
发布2019-03-20 14:33:45
1.1K0
发布2019-03-20 14:33:45
举报
文章被收录于专栏:程序手艺人程序手艺人

项目中有一个小小的需求,实现对数据库的子键更新。如下:

以下的数据存放在数据库中的TestDemo表中

代码语言:javascript
复制
   OP: "UpdateTestDemo",
   ID: "CCCCXXXXXXX",
   Token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
   Info: {
       Email: "email@sugrsugr.com",
       attachInfo: {
           "name": "null",
            "user": "null",
            "version": "V2.0",
            "ipAddress": "192.168.1.1",
            "wifiName": "Test,"
            "Volume": 30,
            "Mute": 1,
       },   
   },

比如只更新attachInf中任意一个子键。

代码语言:javascript
复制
   OP: "UpdateTestDemo",
   ID: "CCCCXXXXXXX",
   Token: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
   Info: {
       Email: "email@sugrsugr.com",
       attachInfo: {
           "name": "null",
            "user": "null",
            "version": "V3.0",
            "ipAddress": "192.168.1.1",
            "wifiName": "Test,"
            "Volume": 30,
            "Mute": 1,
       },   
   },

仔细想了之后,实现的方法有两种:

  1. 首先读出TestDemo表中的数据,然后和设备上传的数据对比,进行赋值操作,然后再把改变后的数据写入TestDemo表中。
  2. DynamoDB中有函数只更新子键的操作,而其他子键不更新。

以上两种办法,肯定是第二种办法比较方便,而且只进行一次update操作,而第一种办法,先进行get操作,然后put操作,进行了两次读写。

评估方案之后,进行具体的实现,实现第二种方案过程中,发现如果上传的子键为null 或 undefined的时候,程序会崩溃。显而易见的是,传参过程中,子键不能为空,但项目需求中每次只更新部分子键,肯定会有子键出现undefined的情况。

仔细阅读文档无果之后,谷歌找答案,发现stackoverflow有人遇到这种情况。  DynamoDB: UpdateItem, Ignore Null values in ExpressionAttributeValues

解决方案是

  1. DynamoDB Java 版本有UPDATE_SKIP_NULL_ATTRIBUTES 支持跳过空参数,但是Node.js 并没有该操作,不过他自己实现了该方案。

尝试之后,发现只支持主键不为空,但是子键没有办法,也可能是我的Node.js 功力不够,无法实现,时间问题,放弃的方案2。果断方案1。

方案1的实现过程

基本操作可以阅读文档Node.js 和 DynamoDB

  • 创建数据库
代码语言:javascript
复制
var AWS = require("aws-sdk");
AWS.config.update({
  region: "us-west-2",
  // 数据存在本地,可以打开
  // endpoint: "http://localhost:8000"
});
var dynamodbDoc = AWS.DynamoDB.DocumentClient({ region: "us-west-2" });
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
    var GetParams = {
         // 表名称
        TableName: 'TestDemo',
        // 主分区键
        Key: {
            Email: device.Email
        }
    }
  • 获取表中的数据和设备数据进行对比,然后更新到表中
代码语言:javascript
复制
    dynamodbDoc.get(GetParams,
        (err, data) => {
        if (err) {
            callback({ ret: "Error" });
            return;
        }
        // data 代表表中的数据
       var attachInfo = data.Item.attachInfo;
       //设备的数据
        var deviceInfo = deviceInfo;
        // 设备的数据赋值给表
        for(var index in deviceInfo) {
            for(var key in attachInfo) {
                if(index == key){
                    //console.log(key+ ": " + index);
                    attachInfo[key] = deviceInfo[index]
                    break;
                }
            }
        }
        var putparams = {
            TableName: 'TestDemo',
            Item: data.Item
        };
        // 改变的子键更新到表中
        dynamodbDoc.put(putparams, function(err, data) {
          if (err) {
            callback({ ret: "Fail" });
          } else {
            callback({ ret: "Success" });
          }
        });
});
在这里插入图片描述
在这里插入图片描述

通过Web DynamoDB 界面看的比较清楚。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档