AWS Lambda Node Js - увеличить значение, если существует, добавить элемент - PullRequest
1 голос
/ 20 сентября 2019

Я хочу увеличить значение, если оно есть, добавить элемент.

+-----------------------+
| id | iteration | data |
+-----------------------+
| 10 |         1 | foo1 |
| 11 |         1 | foo2 |
| 12 |         2 | foo3 |
+-----------------------+

мой код:

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-west-1'}); 
exports.handler = function(event, context, callback) {

var params = {
  Item: {
    id: uuid,
    iteration: 1,
    data: body.data
  },
  TableName: "my-table"
};

documentClient.put(params, function(err, data) {
    if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
      };
      callback(null, errResponse);
    } else {
      console.log("Success", params.Items);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify("thanks")
      };
      callback(null, response);
    }
  });

}

Моя вставка в порядке.

Я пытаюсь:

var params = {
    TableName: "my-table",
    Key:{
        "id": uuid
    },
    UpdateExpression: "set iteration = iteration + :val",
    ExpressionAttributeValues:{
        ":val": 1
    },
    ReturnValues:"UPDATED_NEW"
  };
  documentClient.update(params, function(err, data) {
    if (err) {
        console.error("Unable to update item. Error JSON:", JSON.stringify(err, null, 2));
        const errResponse = {
          statusCode: 500,
          headers: {
            "Access-Control-Allow-Origin": "*"
          },
          body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
        };
        callback(null, errResponse);
    } else {
        console.log("UpdateItem succeeded:", JSON.stringify(data, null, 2));
        const response = {
          statusCode: 200,
          headers: {
            "Access-Control-Allow-Origin": "*"
          },
          body: JSON.stringify("thanks")
        };
        callback(null, response);
    }
  });

Обновление в порядке (приращение -> 2)

Но я хочу, чтобы я хотел увеличить значение ТОЛЬКО , если существует, ТОЛЬКО добавить элемент.Оба метода асинхронные, как я должен делать?

1 Ответ

1 голос
/ 28 сентября 2019

Ваш второй ответ близок.В вашем UpdateExpression вам нужны и ADD, и SET в одной строке.как следующее:

    UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",

Это формально задокументировано в AWS DOCS для UpdateItem при прокрутке DynamoDB вниз, оно говорит:

ADD - добавляет указанное значениек элементу, если атрибут еще не существует.Если атрибут существует, то поведение ADD зависит от типа данных атрибута: если существующий атрибут является числом, а если значение также является числом, то значение математически добавляется к существующему атрибуту.Если значение является отрицательным числом, то оно вычитается из существующего атрибута.

Мне удалось найти сообщение на форуме AWS , которое успешно завершилось, а также другое SO ответ с синтаксисом ADD и SET в одной строке.Ниже приведен код, который будет запускаться, если его поместить в новую лямбду (измените свой регион, чтобы он соответствовал таблице)

var AWS = require('aws-sdk');
var documentClient = new AWS.DynamoDB.DocumentClient({'region': 'eu-central-1'});

exports.handler = function(item, context, callback) {

    var params = {
        TableName: "my-table",
        Key:{
            "id": item.id
        },
        UpdateExpression: "ADD iteration :iteration SET itemdata = :itemdata",
        ExpressionAttributeValues:{
            ':iteration': 1,
            ':itemdata' : item.data
        },
        ReturnValues:"NONE"
};

documentClient.update(params, function(err, data) {
    if (err) {
      console.log("Error", err);
      const errResponse = {
        statusCode: 500,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify({ Error: 500, device : "DynamoDB", detail : err })
      };
      callback(null, errResponse);
    } else {
      console.log("Success", params.Items);
      const response = {
        statusCode: 200,
        headers: {
          "Access-Control-Allow-Origin": "*"
        },
        body: JSON.stringify("upsert complete.")
      };
      callback(null, response);
    }
  });
};

примечание: данные являются зарезервированным ключевым словом, и я получилследующая ошибка:

Invalid UpdateExpression: Attribute name is a reserved keyword; reserved keyword: data

рассмотрите возможность изменения на что-то другое.Я использовал itemdata.

Запуск его один раз вставит новую запись.Следующие изображения приведены до и после изображений таблицы после второго запуска лямбды.
enter image description here enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...