обновить (добавить) DynamodB с лямбда-функцией - PullRequest
0 голосов
/ 08 февраля 2019

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

Я создал запись таблицы в DynamoDB со следующей лямбда-функцией:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2', apiVersion: '2012-08-10'})

exports.handler = (event, context, callback) => {
    console.log(event)

    const params = {
        Item: {
            "UserId": {
                S: "global" 
            },
            "search": {
                        SS: [
                             "" + event.hashtag
                            ]
            }
        },
        TableName: "crypto-app"
    };
    dynamodb.putItem(params, function(err, data) {
        if (err) {
            callback(err)
        } else {
            callback(null, data)
        }
    });
};

это создает простой набор строк

 {
  "search": {
    "SS": [
      "london"
    ]
  },
  "UserId": {
    "S": "global"
  }
}

как я могу добавить большестроки в мой набор строк с лямбда-функцией, чтобы сделать это так?

{
  "search": {
    "SS": [
      "london", "tokyo", "moskow" 
    ]
  },
  "UserId": {
    "S": "global"
  }
}

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Обновление по этому вопросу

Обновление значений набора строк на самом деле не является хорошей практикой.У меня не было много знаний о базах данных и таблицах.Добавление полей и ячеек - это очень надежный способ хранения записей, вместо того, чтобы пытаться хранить огромный массив строк в одной ячейке.

0 голосов
/ 08 февраля 2019

Вы можете обновить элемент и добавить дополнительные строковые значения.

Вот как вы бы это сделали, если бы назвали атрибут xxx вместо search, который является зарезервированным словом .

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2'});

const params = {
  Key: {
    UserId: {
      S: 'global',
    },
  },
  UpdateExpression: 'ADD xxx :avals',
  ExpressionAttributeValues: {
    ':avals': {
      SS: ['tokyo', 'moskow'],
    },
  },
  TableName: 'crypto-app',
};

dynamodb.updateItem(params, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

Однако, поскольку вы назвали атрибут search, который зарезервирован, вам необходимо по существу экранировать это зарезервированное имя, используя имя атрибута выражения , котороезаполнитель, который вы используете в выражении, в качестве альтернативы фактическому имени атрибута.

Вот пример того, как вы это делаете:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({region: 'us-east-2'});

const params = {
  Key: {
    UserId: {
      S: 'global',
    },
  },
  UpdateExpression: 'ADD #a :avals',
  ExpressionAttributeValues: {
    ':avals': {
      SS: ['tokyo', 'moskow'],
    },
  },
  ExpressionAttributeNames: {
    '#a': 'search',
  },
  TableName: 'crypto-app',
};

dynamodb.updateItem(paramse, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});

Другой, возможно, лучший способ сделать этоэто для использования DynamoDB DocumentClient .Это клиентский интерфейс более высокого уровня, который упрощает работу с элементами, абстрагируя понятие значений атрибутов и вместо этого используя собственные типы JavaScript.

С DocumentClient вместо явной записи UserId: { 'S': 'global' } вы можете просто использоватьUserId: 'global' и тип строки ('S') будет выведен.

Вот пример обновления элемента с использованием DocumentClient:

const AWS = require('aws-sdk');
const dc = new AWS.DynamoDB.DocumentClient({region: 'us-east-2'});

const params = {
  Key: {
    UserId: 'global',
  },
  UpdateExpression: 'ADD #a :avals',
  ExpressionAttributeValues: {
    ':avals': dc.createSet(['tokyo', 'moskow']),
  },
  ExpressionAttributeNames: {
    '#a': 'search',
  },
  TableName: 'crypto-app',
};

dc.update(params, (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
  }
});
...