Как я могу использовать транзакции, чтобы проверить, существует ли элемент в одной таблице, прежде чем обновлять вторую таблицу с помощью AWS.DynamoDB.DocumentClient? - PullRequest
0 голосов
/ 04 мая 2019

Я новичок в DynamoDB.У меня есть таблица DynamoDB под названием «детские профили», в которой перечислены дочерние профили для пользователя (первичный ключ раздела «userId», первичный ключ сортировки «childId»).У меня есть вторая таблица с именем 'kids-tasks', в которой перечислены задачи для дочернего элемента (первичный ключ раздела 'childId', первичный ключ сортировки 'taskId').Я хотел бы атомарно добавить элемент в таблицу «kids-tasks» только в том случае, если в таблице «kids-profile» существует «childId».

Я пытаюсь использовать метод transactWrite класса AWS.DynamoDB.DocumentClient (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html) для достижения этой цели, но не могу заставить его работать. Сначала, когда я пытаюсь добавитьConditionCheck для TransactionItems, он говорит, что «TransactItems может содержать только один из Check, Put, Update или Delete». Поэтому я изменил «ConditionCheck» на «Check», предполагая, что это правильно, хотя это не упоминается в документацииВо-вторых, когда я выполняю его, он добавляет задачу в таблицу «kids-tasks» независимо от того, существует ли «childId» в таблице «kids-profile».

    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 голосов
/ 19 июня 2019

Разделите объекты на отдельные операции.

 const params = {
     TransactItems: [ 
         {
            ConditionCheck: {
                ...
            },
+        }, // <------ !!!!!
+        {
             Put: {
                ...
         }
     ]
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...