我试图更新作为字符串列表的items属性。 只有在属性不存在时才能更新(追加)属性。 list_append&amp ;; if_not_exists。
var params = {...
UpdateExpression:
'SET friends = list_append(if_not_exists(friends,:empty_list),:new_friend)',
ExpressionAttributeValues:{ ":new_friend": [{"S":"Bobo"}], ":empty_list" :[] } };
这不起作用,有办法吗? 所以,如果Bobo仍然不在我的“朋友”列表中,它会附加它
答案 0 :(得分:8)
您可以根据您的要求使用“不包含”和“list_append”。
如果朋友尚未出现在列表中,则以下代码会将新朋友插入列表。
如果朋友已经出现在列表中,则会抛出“条件请求失败”。
条件失败时出现错误消息: -
Unable to update item. Error JSON: {
"message": "The conditional request failed",
"code": "ConditionalCheckFailedException",
"time": "2016-06-22T08:18:36.483Z",
"requestId": "86805965-240b-43e0-8fdc-77fb9ae1b15c",
"statusCode": 400,
"retryable": false,
"retryDelay": 0
}
以下代码运行正常。它已经成功测试过。
代码示例:
var AWS = require("aws-sdk");
AWS.config.update({
region : "us-west-2",
endpoint : "http://localhost:8000"
});
var docClient = new AWS.DynamoDB.DocumentClient();
var table = "users";
var userid = 1;
var friendId = ["f4"];
var friendIdStr = "f4";
//Add the new DOCUMENT TYPE attribute to the table
var params = {
TableName : table,
Key: {
"id" : userid
},
"UpdateExpression": "set friends = list_append (friends, :friendId)",
"ConditionExpression": "not contains (friends, :friendIdStr)",
"ExpressionAttributeValues": {
":friendId": friendId,
":friendIdStr" : friendIdStr
},
"ReturnValues" : "UPDATED_NEW"
};
console.log("Updated an item...");
docClient.update(params, function(err, data) {
if (err) {
console.error("Unable to update item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
console.log("Updated item:", JSON.stringify(data, null, 2));
}
});
答案 1 :(得分:2)
我试图将字符串添加到列表中时才找到答案。
经过研究,我意识到我应该使用字符串集而不是列表。
这是我用来向字符串集中添加项目的参数。 (它会自动处理防欺诈)
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
const item = 'unique string to add to set';
const params = {
TableName: 'myTable',
Key: {
myId,
},
UpdateExpression:
'ADD myList :myItem',
ExpressionAttributeValues: {
':myItem': docClient.createSet([item]),
},
ReturnValues: 'UPDATED_NEW',
};
docClient.update(params);
注意:如果集不存在,createSet将创建该集,如果已经存在,则添加项目。