我正在使用Nodejs和DynamoDB作为后端创建API。我正在尝试更新项目以添加到一组"朋友"。当我更新用户时,我收到错误,"无效的UpdateExpression:操作符或函数的操作数类型不正确; operator:ADD,operand type:MAP"。我的理解是,当添加到不存在的集合时,将创建集合。如果它已存在,则应将新值添加到集合中。我不明白为什么我尝试ADD的集合被读作地图。
如何创建用户:
var params = {
TableName: "users",
Item:{
"id": Number(id),
"name": name,
"password": password
}
};
documentClient.put(params, function(err, data) {
if(err)
res.json(500, err);
else
res.json(200, data);
});
如何添加朋友:
var params = {
TableName: "users",
Key: {
"id": id
},
UpdateExpression: "ADD friends :friendId",
ExpressionAttributeValues: {
":friendId": { "NS": [friendId] }
},
ReturnValues: "UPDATED_NEW"
};
documentClient.update(params, function(err, data) {
if(err)
res.json(500, err);
else
res.json(200, data);
});
答案 0 :(得分:4)
这个问题在这里有答案
https://stackoverflow.com/a/38960676/4975772
此处列出了符合您问题的相关代码
let AWS = require('aws-sdk');
let docClient = new AWS.DynamoDB.DocumentClient();
...
var params = {
TableName : 'users',
Key: {'id': id},
UpdateExpression : 'ADD #friends :friendId',
ExpressionAttributeNames : {
'#friends' : 'friends'
},
ExpressionAttributeValues : {
':friendId' : docClient.createSet([friendId])
},
ReturnValues: 'UPDATED_NEW'
};
docClient.update(params, callback);
如果该设置不存在,那么该代码将为您创建。您还可以使用其他集运行该代码以更新集合的元素。超级方便。
答案 1 :(得分:1)
这是工作代码。你不需要在这里添加ADD。只需使用"设置friends =:friendId"由于朋友属性尚未出现在表中(即在更新之前,表中只有id,name和password)。作为更新的一部分,将新添加friend属性。
var docClient = new AWS.DynamoDB.DocumentClient();
var table = "users";
var userid = 1;
var friendId = [123];
var params = {
TableName : table,
Key: {
"id" : userid
},
"UpdateExpression": "set friends = :friendId",
"ExpressionAttributeValues": {
":friendId": {"NS": friendId}
},
"ReturnValues" : "UPDATED_NEW"
};