我有一个dynamoDB表,其中包含一个包含UserId和List列表的Item。它看起来像这样:
Item:
{
UserId: 'abc123',
Lists: [
{
id: 1,
title: 'My favorite movies',
topMovies: [
{
id: 1,
title: 'Caddyshack'
},
{
id: 2,
title: 'Star Wars'
}
]
}
]
}
现在,让用户创建一个名为“我最喜欢的电视节目”的新列表,并希望将其插入ID为2的列表数组中。
如何使用文档客户端更新此对象。我已经看了几个例子,但我发现没有什么可以解释我正在尝试做什么。这让我觉得也许我没有正确使用DynamoDB,我应该有一个不同的对象架构。
我试图使用它,但它覆盖了我以前的对象。
exports.handler = (event, context, callback) => {
console.log(event);
const params = {
TableName: "top-ten",
Key: {
"UserId": 'abc123',
},
UpdateExpression: "set Lists =:newItem",
ExpressionAttributeValues: {
":newItem": {
"id": 2,
"title": "Favorite TV Shows",
"topMovies": [{"id": 1, "title" : "The Simpsons"}]
},
},
ReturnValues: "UPDATED_NEW"
};
dynamodb.update(params, function(err, data) {
if (err) {
console.log(err);
callback(err);
} else {
console.log(data);
callback(null, data);
}
});
};
编辑:好的,我已经想出如果我把
UpdateExpression: "set Lists[1] =:newItem"
它正确更新项目。但是现在,我怎么知道列表数组中有多少项?
答案 0 :(得分:3)
您应该使用list_append。该函数将两个列表一起添加,因此您需要使项目添加列表。
exports.handler = (event, context, callback) => {
console.log(event);
const params = {
TableName: "top-ten",
Key: {
"UserId": 'abc123',
},
UpdateExpression : "SET #attrName = list_append(#attrName, :attrValue)",
ExpressionAttributeNames : {
"#attrName" : "Lists"
},
ExpressionAttributeValues : {
":attrValue" : [{
"id": 2,
"title": "Favorite TV Shows",
"topMovies": [{"id": 1, "title" : "The Simpsons"}]
}]
},
ReturnValues: "UPDATED_NEW"
};
dynamodb.update(params, function(err, data) {
if (err) {
console.log(err);
callback(err);
} else {
console.log(data);
callback(null, data);
}
});