UpdateExpression Увеличивает значение вложенной карты в списке - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть следующая структура таблицы:

{myHashKey: x, someList: [{info: uniqueID, myAttribute: number, ...}, ...]}

Я бы хотел увеличить number для данного податрибута info.то есть, скажем, у меня есть следующий элемент, вставленный в Dynamodb:

{myHashKey: 'xxxx', someList: [{info: 'a', myAttribute: 1}, {info: 'b', myAttribute: 42}]}

Какое UpdateExpression я должен выполнить, чтобы обновить элемент, чтобы увеличить myAttribute для данной информации на заданное число, скажем, я хочуувеличить myAttribute 1 для информации a до 5, то есть перейти от вышеприведенного к следующему:

{myHashKey: 'xxxx', someList: [{info: 'a', myAttribute: 5}, {info: 'b', myAttribute: 42}]}

?

Я прочитал несколько документов и другой стекопотоксообщений, но все еще не может достичь этого.

1 Ответ

0 голосов
/ 10 декабря 2018

Невозможно эффективно настроить таргетинг на элемент в списке для обновления.Я не думаю, что это возможно с вашей структурой таблицы.Некоторое время назад у меня была такая же проблема, но я не нашел решения.Я могу изменить структуру таблицы.

Полагаю, ваш стол плохо спроектирован для того, что вы хотите сделать.DynamoDB - это база данных столбцов, используйте ее.

Предложение таблицы:

  • Хеш: myHashKey // такой же, как сейчас
  • Диапазон: info другие поля myAttribute

Когда вы знаете myHashKey и info, вы можете легко найти и обновить.

var docClient = new AWS.DynamoDB.DocumentClient();

function async increment(myHashKeyValue, infoValue, value = 1) {

    var params = {
        TableName:table,
        Key:{
            "myHashKey": myHashKeyValue,
            "info": infoValue,
        },
        UpdateExpression: "set #myAttribute = #myAttribute + :val",
        ExpressionAttributeValues:{
            ":val": value,
        },
        ExpressionAttributeNames:{
            '#myAttribute': 'myAttribute',
        },
        ReturnValues:"UPDATED_NEW"
    };

    await docClient.update(params).promise();
});

}

...