DynamoDB, как мы видели ранее, представляет собой высокопроизводительную платформу базы данных NoSQL AWS, и, на мой взгляд, она довольно удивительна, однако для того, чтобы привыкнуть к ней, требуется время, особенно если вы уже много лет работаете с реляционными схемами, такими как SQL. , поэтому я надеюсь, что это поможет. обратитесь к официальной Документации AWS этой библиотеки для получения дополнительной информации.
Предпосылки
- Аккаунт AWS
- AWS CLI уже установлен и настроен
Схема
Поместить предмет
В DynamoDB у нас нет прямой операции insert, вместо этого у нас есть операция put, которая представляет собой операцию записи, которая устанавливает запись в базе данных, будьте осторожны с этой операцией поскольку вы можете перезаписывать записи, если их первичный ключ совпадает, чтобы предотвратить это, мы используем выражение условия, которое проверяет, существовал ли ранее первичный ключ. В приведенном ниже примере мы можем наблюдать следующие параметры:
- TableName: имя вашей таблицы DynamoDB.
- Пункт: данные, которые мы собираемся вставить, должны иметь действительный первичный ключ.
- ConditionExpression (необязательно): в этом примере это предотвращает перезапись существующих элементов.
- ReturnConsumedCapacity (необязательно): этот параметр возвращает количество единиц емкости, которые мы использовали в операциях.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1'}) let params = { TableName: 'ServerlessSeries', Item: { pk: "[email protected]", sk: "user", first_name: "Marco", last_name: "Mercado" }, ConditionExpression: "attribute_not_exists(pk)", ReturnConsumedCapacity: 'TOTAL' } dynamodb.put(params, (err, data) => { if (err) console.log(err) else console.log(data) })
Обновить элемент
Операция обновления элемента немного сложнее, чем операция размещения, основные отличия заключаются в том, что, в отличие от операции размещения, нам нужно нацелиться на существующий элемент, чтобы обновить информацию о нем. В приведенном ниже примере мы можем наблюдать следующие параметры:
- Ключ: первичный ключ элемента.
- UpdateExpression: атрибуты, которые мы собираемся обновить, и соответствующие значения.
- ExpressionAttributeNames: это немного сложно, потому что это декларативный параметр атрибутов, которые мы собираемся обновить, он используется в выражении обновления, чтобы избежать проблем с зарезервированными словами и любых других проблем, связанных с интерпретацией это выражение.
- ExpressionAttributeValues: это похоже на ExpressionAttributeNames, но вместо объявления имен атрибутов, которые мы собираемся использовать в выражении обновления, мы объявляем значения.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1'}) let params = { TableName: 'ServerlessSeries', Key: { pk: '[email protected]', sk: 'user' }, ExpressionAttributeNames: { '#last_name': 'last_name' }, ExpressionAttributeValues: { ':last_name': 'Uchiha' }, UpdateExpression: 'SET #last_name = :last_name', ReturnConsumedCapacity: 'TOTAL' } dynamodb.update(params, (err, data) => { if (err) console.log(err) else console.log(data) })
Сканировать
Это самая простая операция, но и самая неэффективная, это полное сканирование базы данных, которое может фильтровать данные, но имеет некоторые ограничения, с точки зрения производительности, намного медленнее, чем запрос операция, и с точки зрения удобства использования он может сканировать только 1 МБ данных, если мы сканируем больше, нам нужно запускать его несколько раз, каждый раз указывая, где мы остановились.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1'}) let params = { TableName: 'ServerlessSeries', ReturnConsumedCapacity: 'TOTAL' } dynamodb.scan(params, (err, data) => { if (err) console.log(err) else console.log(data.Items) })
Получить товар
Чтобы вернуть один элемент, мы используем операцию get, нам просто нужен первичный ключ, как мы видели в операции update item.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1'}) let params = { TableName: 'ServerlessSeries', Key: { pk: '[email protected]', sk: 'user' }, ReturnConsumedCapacity: 'TOTAL' } dynamodb.get(params, (err, data) => { if (err) console.log(err) else console.log(data.Item) })
Удалить пункт
Удалить элемент — довольно простая операция, очень похожая на операцию get.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1'}) let params = { TableName: 'ServerlessSeries', Key: { pk: '[email protected]', sk: 'user' }, ReturnConsumedCapacity: 'TOTAL' } dynamodb.delete(params, (err, data) => { if (err) console.log(err) else console.log(data) })
Транзакция Запись
Это, на мой взгляд, самый сложный, хотя с небольшой практикой он также довольно прост, принцип его работы заключается в том, что мы можем отправить до 25 элементов за одну транзакцию, и если одна из этих операций завершится неудачно, транзакция откатится и из-за этого каждая операция транзакции потребляет двойное количество единиц емкости. В примере ниже мы можем наблюдать следующие параметры:
- TransactItems: это список транзакций для выполнения, каждая транзакция записи в зависимости от того, является ли она обновлением, размещением или удалением, имеет те же параметры, что и ее отдельная транзакция.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1' }) let params = { ReturnConsumedCapacity: 'TOTAL', TransactItems: [ { Put: { TableName: 'ServerlessSeries', Item: { pk: 'T001', sk: 'task', task_title: 'Clean the kitchen', task_description: 'The assignment is to clean the kitchen this includes wash the dishes, clean the stove, sweep and mop the floor', } }, }, { Put: { TableName: 'ServerlessSeries', Item: { pk: 'T002', sk: 'task', task_title: 'Wash the car', task_description: 'The car should look like new', } }, }, { Put: { TableName: 'ServerlessSeries', Item: { pk: '[email protected]', sk: 'task#T001', assigned_on: new Date().toISOString(), assignment_status: 'IN_PROGRESS' } }, }, { Put: { TableName: 'ServerlessSeries', Item: { pk: '[email protected]', sk: 'task#T002', assigned_on: new Date().toISOString(), assignment_status: 'FINISHED', finished_at: new Date().toISOString() } } } ] } dynamodb.transactWrite(params, (err, data) => { if (err) console.log(err) else console.log(data) })
Запрос
И последнее, но не менее важное, на мой взгляд, операция query является наиболее важной, потому что это ваша главная забота при разработке таблицы DynamoDB, если вы не принимаете во внимание, как запрос работает, и бизнес-требования, которые вы хотите выполнить, вы можете легко ненавидеть DynamoDB. В приведенном ниже примере мы можем наблюдать следующие параметры:
- KeyConditionExpression: как я упоминал ранее, операция query имеет очень важное ограничение для подсчета, и это ограничение находится в этом параметре, чтобы воспользоваться преимуществами производительности DynamoDB, вы должны указать раздел key, к которому вы стремитесь, в противном случае вам нужно будет создать вторичные индексы или выполнить операцию scan.
const AWS = require('aws-sdk') let dynamodb = new AWS.DynamoDB.DocumentClient({ region: 'us-east-1'}) let params = { TableName: 'ServerlessSeries', ReturnConsumedCapacity: 'TOTAL', ExpressionAttributeNames: { '#sk': 'sk', '#pk': 'pk' }, ExpressionAttributeValues: { ':sk': 'task#', ':pk': '[email protected]' }, KeyConditionExpression: '#pk = :pk and begins_with(#sk, :sk)' } dynamodb.query(params, (err, data) => { if (err) console.log(err) else console.log(data.Items) })
Заключительные комментарии
В DynamoDB есть еще несколько таких пакетных операций (по сути, это транзакция без отката в случае сбоя одной или нескольких операций), но я надеюсь, что этот пост поможет вам использовать операции DynamoDB. Гитхаб