如何使用文档客户端更新 dynamodb 中的嵌套列表数据

iam*_*tis 5 node.js amazon-dynamodb

我有一个 dynamoDB 表,它有一个包含 UserId 和列表列表的项目。它看起来像这样:

Item: 
{
    UserId: 'abc123',
    Lists: [
        {
            id: 1,
            title: 'My favorite movies',
            topMovies: [
                {
                    id: 1,
                    title: 'Caddyshack'
                },
                {
                    id: 2,
                    title: 'Star Wars'
                }
            ]

        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

现在,让用户创建一个名为“我最喜欢的电视节目”的新列表,并希望将其插入到 id 为 2 的 Lists 数组中。

我将如何使用文档客户端更新此对象。我查看了几个示例,但没有发现任何可以解释我正在尝试做的事情。这让我觉得我可能没有正确使用 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);
    }
});
Run Code Online (Sandbox Code Playgroud)

};

编辑:好的,我发现如果我把

 UpdateExpression: "set Lists[1] =:newItem" 
Run Code Online (Sandbox Code Playgroud)

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

F_S*_*O_K 7

您应该使用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);
    }
});
Run Code Online (Sandbox Code Playgroud)