在使用AWS.DynamoDB.DocumentClient更新第二张表之前,如何使用事务检查某张表中是否存在项目?

时间:2019-05-03 21:33:39

标签: javascript amazon-dynamodb

我是DynamoDB的新手。我有一个名为“ kids-profiles”的DynamoDB表,该表列出了用户的子配置文件(主分区键“ userId”,主排序键“ childId”)。我还有第二个表称为“ kids-tasks”,该表列出了一个子任务(主分区键“ childId”,主排序键“ taskId”)。我想仅在“儿童配置文件”表中存在“ childId”的情况下,才将原子项添加到“儿童任务”表中。

我正在尝试使用AWS.DynamoDB.DocumentClient类(https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html)的transactWrite方法来实现此目的,但是我无法使其工作。首先,当我尝试将ConditionCheck添加到TransactionItems时,它说“ TransactItems只能包含Check,Put,Update或Delete中的一个”。因此,我将“ ConditionCheck”更改为“ Check”,即使这在文档中未提及,也假定这是正确的。其次,当我执行它时,无论“ kids-profiles”表中是否存在“ childId”,它都会将任务添加到“ kids-tasks”表中。

    const params = {
        TransactItems: [ 
            {
                Check: {
                    TableName: "kids-profiles",
                    Key: {
                        userId:   userId,
                        childId:  childId,
                    },
                    ConditionExpression: "attribute_exists(childId)",
                },
                Put: {
                    TableName: "kids-tasks",
                    Item: {
                        childId:  childId,
                        taskId:   uuid.v1(),
                        title:    title,
                    }
                }
            }
        ]
    };

    try 
    {
        await dynamoDb.transactWrite(params).promise();
        console.log("Success!");
    } 
    catch (error) 
    {
        console.log("Error");
    }

1 个答案:

答案 0 :(得分:0)

将对象划分为单独的操作。

 const params = {
     TransactItems: [ 
         {
            ConditionCheck: {
                ...
            },
+        }, // <------ !!!!!
+        {
             Put: {
                ...
         }
     ]
 };