如何使用文档客户端

时间:2018-01-14 22:37:58

标签: node.js amazon-dynamodb

我有一个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" 

它正确更新项目。但是现在,我怎么知道列表数组中有多少项?

1 个答案:

答案 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);
    }
});