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」を使用してください。 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" 
}; 
+1

これはエラーなく実行されますが、動作は私が望むものではありません。 SETを2度実行すると、古い入力が置き換えられます。古いデータを保持しながら、新しい入力をセットに追加したい。私は、私の希望する行動を明確にするために質問を修正します。 –

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

に合うようにフォーマットされ、関連するコードがありますしていますあなたのためにそれを作成します。このコードを別のセットで実行して、セットのエレメントを更新することもできます。スーパー便利。

関連する問題