2016-06-02 4 views
2

Nodejs 및 DynamoDB를 백엔드로 사용하여 API를 생성하고 있습니다. 한 세트의 "친구"를 추가하기 위해 항목을 업데이트하려고합니다. 사용자를 업데이트하면 "유효하지 않은 UpdateExpression : 연산자 또는 함수에 대한 잘못된 피연산자 유형, 연산자 : ADD, 피연산자 유형 : MAP"오류가 발생합니다. 내 이해는 존재하지 않는 세트에 추가 할 때 세트가 작성된다는 것입니다. 이미 존재하는 경우 새 값을 집합에 추가해야합니다. 내가 추가하려고 시도하는 설정이지도로 읽히는 이유를 이해할 수 없습니다. 사용자가 생성되는 방법AWS DynamoDB 세트 - 잘못된 피연산자에 추가하려고 시도합니다.

은 :

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

여기 작업 코드입니다. 여기에 ADD가 필요하지 않습니다. 친구 속성이 아직 표에 없습니다 (예 : 업데이트하기 전에 표에 ID, 이름 및 비밀번호 만 있음) "set friends = : friendId"를 사용하십시오. 친구 속성이 업데이트의 일부로 새로 추가됩니다.

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" 
}; 
+1

오류없이 실행되지만, 원하는 동작이 아닙니다. SET를 다시 실행하면 이전 입력을 바꿉니다. 이전 데이터를 유지하면서 새 입력을 집합에 추가하려고합니다. 나는 원하는 행동을 명확하게하기 위해 질문을 개정 할 것이다. –

+0

ADD 작업에 문제가있는 것 같습니다. API 자체에 문제가있는 것 같습니다. – notionquest

3

이 질문은 여기에 대한 답변

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); 

에 맞게 포맷 관련 코드의있다 그것을 당신을 위해 창조하십시오. 이 코드를 다른 세트로 실행하여 세트의 요소를 업데이트 할 수도 있습니다. 슈퍼 편리한.

관련 문제