尝试添加到集合的AWS DynamoDB-错误的操作数

Mar*_*ler 4 amazon-web-services amazon-dynamodb

我正在使用Nodejs和DynamoDB作为后端创建API。我试图更新一个项目以添加到一组“朋友”中。更新用户时,出现错误“无效的UpdateExpression:运算符或函数的操作数类型不正确;运算符:ADD,操作数类型:MAP”。我的理解是,当添加到不存在的集合时,将创建该集合。如果已经存在,则应将新值添加到集合中。我不明白为什么我尝试添加的集合被读取为地图。

如何创建用户:

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);
});
Run Code Online (Sandbox Code Playgroud)

如何添加朋友:

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);
});
Run Code Online (Sandbox Code Playgroud)

jos*_*ell 5

这个问题在这里有答案

/sf/answers/2727247351/

这是格式化为适合您问题的相关代码

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);
Run Code Online (Sandbox Code Playgroud)

如果该集合不存在,那么该代码将为您创建它。您还可以使用其他集合运行该代码以更新集合的元素。超级方便。


not*_*est 0

这是工作代码。这里不需要ADD。只需使用“set Friends = :friendId”,因为朋友属性尚未出现在表中(即在更新之前,表中只有 ID、姓名和密码)。作为更新的一部分,好友属性被新添加。

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"
};
Run Code Online (Sandbox Code Playgroud)

  • 这运行没有错误,但行为不是我想要的。当第二次运行 SET 时,它会替换旧的输入。我想将新输入添加到集合中,同时保留旧数据。我将修改问题以明确我想要的行为。 (3认同)