ItemCollectionMetrics пуст после успешной записи транзакции с использованием DynamoDB.DocumentClient

Я выполняю transactWrite (https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#transactWrite-property) к DynamoDb и ожидаю получить обратно ItemCollectionMetrics (я указываю ReturnItemCollectionMetrics: 'SIZE' в запросе).

Объект возвращается пустым {}, хотя в таблицах db Dynamo произошли изменения.

Есть у кого-нибудь представление об этом?

Код

const dynamoResponse = await dynamoDbDocumentClient.transactWrite({
        TransactItems: [
            {
                Put: {
                    TableName: ENV.BLAH_CONTENT_COUNT_MESSAGES_TABLE,
                    ExpressionAttributeNames : {
                        '#v' : 'v',
                    },
                    ExpressionAttributeValues : {
                        ':v' : blah.v
                    },
                    ConditionExpression: '(attribute_exists(blahId) AND #v<>:v) OR attribute_not_exists(blahId)',
                    Item: {...blahCountMessage}
                }
            },
            {
                Update: {
                    TableName: ENV.BLAH_CONTENT_COUNTS_TABLE,
                    Key: { id: blahContentCount.id },
                    ExpressionAttributeNames : {
                        '#v' : 'v',
                        '#count' : 'count',
                        '#contentId': 'contentId'
                    },
                    ExpressionAttributeValues : {
                        ':v' : 1,
                        ':count' : deleted ? -1: 1,
                        ':contentId': blahContentCount.contentId,
                        ':defaultNumber': 0
                    },
                    ConditionExpression: 'attribute_not_exists(cognitoId)',
                    UpdateExpression: 'SET #contentId = :contentId, #count = if_not_exists(#count, :defaultNumber) + :count, #v = if_not_exists(#v, :defaultNumber) + :v',
                    ReturnValuesOnConditionCheckFailure: 'ALL_OLD'
                }
            }
        ],
        ReturnItemCollectionMetrics: 'SIZE'
    }).promise();

Outupt

console.log(JSON.stringify(dynamoResponse.ItemCollectionMetrics)); // {}

Спасибо!


person Santiago Ferrer Deheza    schedule 28.10.2019    source источник
comment
Можете ли вы изменить ReturnItemCollectionMetrics на NONE и поделиться результатом?   -  person Amit Baranes    schedule 28.10.2019
comment
Я получу undefined, если сделаю console.log(JSON.stringify(dynamoResponse.ItemCollectionMetrics));   -  person Santiago Ferrer Deheza    schedule 28.10.2019
comment
Ну .. это только предположение, но .. Попробуйте удалить await .promise   -  person Amit Baranes    schedule 28.10.2019
comment
ну, не знаю, как это сработает. sdk основан на обещаниях, вам нужно обещание и ожидание результата.   -  person Santiago Ferrer Deheza    schedule 28.10.2019


Ответы (1)


ReturnItemCollectionMetrics:

«Информация о коллекциях элементов, если таковые имеются, на которые повлияла операция. ItemCollectionMetrics возвращается только в том случае, если запрос был запрошен. Если таблица не имеет каких-либо локальных вторичных индексов, эта информация не возвращается в ответ».

Автор: https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ItemCollectionMetrics.html

Может быть, эта транзакция либо ничего не обновляет, либо у вас нет LSI?

Также обратите внимание: в документации говорится, что транзакции отключены для «глобальных таблиц», я не совсем уверен, означают ли они GSI ... но я не использую LSI, что также может быть причиной того, что в ответ не возвращается ItemCollectionMetrics. к моим сделкам.

Если вы обновите свой объект параметра, чтобы включить ReturnConsumedCapacity: 'TOTAL', объект ответа должен выглядеть так:

   [ { TableName: 'table_name',
       CapacityUnits: 8,
       WriteCapacityUnits: 8 } ] }


person Chris Barrett    schedule 29.10.2019
comment
Спасибо, Крис! Думаю, я пропустил LSI часть в документации. Похоже, это так! - person Santiago Ferrer Deheza; 01.11.2019