项目中有一个小小的需求,实现对数据库的子键更新。如下:
以下的数据存放在数据库中的TestDemo表中
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中任意一个子键。
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,
},
},
仔细想了之后,实现的方法有两种:
以上两种办法,肯定是第二种办法比较方便,而且只进行一次update操作,而第一种办法,先进行get操作,然后put操作,进行了两次读写。
评估方案之后,进行具体的实现,实现第二种方案过程中,发现如果上传的子键为null 或 undefined的时候,程序会崩溃。显而易见的是,传参过程中,子键不能为空,但项目需求中每次只更新部分子键,肯定会有子键出现undefined的情况。
仔细阅读文档无果之后,谷歌找答案,发现stackoverflow有人遇到这种情况。 DynamoDB: UpdateItem, Ignore Null values in ExpressionAttributeValues
解决方案是
尝试之后,发现只支持主键不为空,但是子键没有办法,也可能是我的Node.js 功力不够,无法实现,时间问题,放弃的方案2。果断方案1。
方案1的实现过程
基本操作可以阅读文档Node.js 和 DynamoDB
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" });
var GetParams = {
// 表名称
TableName: 'TestDemo',
// 主分区键
Key: {
Email: device.Email
}
}
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 界面看的比较清楚。