DynamoDB, как мы видели ранее, представляет собой высокопроизводительную платформу базы данных NoSQL AWS, и, на мой взгляд, она довольно удивительна, однако для того, чтобы привыкнуть к ней, требуется время, особенно если вы уже много лет работаете с реляционными схемами, такими как SQL. , поэтому я надеюсь, что это поможет. обратитесь к официальной Документации AWS этой библиотеки для получения дополнительной информации.

Предпосылки

Схема

Поместить предмет

В 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. Гитхаб