ダメ元エンジニアのお勉強おメモ

ほとんど自分用のメモです。AWS をよく触ります。Web アプリとか作ります。Raspberry Pi も好きです。

DynamoDB の UpdateItem で加算処理を行う

概要

加算処理を行うとき毎回調べるのでメモる。

コード

TypeScript だとこんな感じ。

import * as DynamoDB from 'aws-sdk/clients/dynamodb';

const DYNAMODB_API_VERSION = '2012-10-08';
const REGION = 'ap-northeast-1';
const TABLE_NAME = 'sample-table';

const dynamodbDocumentClient = new DynamoDB.DocumentClient({
  apiVersion: DYNAMODB_API_VERSION,
  region: REGION,
});

(async () => {
  const params: DynamoDB.DocumentClient.UpdateItemInput = {
    TableName: TABLE_NAME,
    Key: {
      pk: 'sample-id',
      sk: 1,
    },
    UpdateExpression: 'set cnt = cnt + :add',
    ExpressionAttributeValues: {
      ':add': 1,
    },
  };

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

ダメな例

普通に +1 とかを書くのはエラーになる。

import * as DynamoDB from 'aws-sdk/clients/dynamodb';

const DYNAMODB_API_VERSION = '2012-10-08';
const REGION = 'ap-northeast-1';
const TABLE_NAME = 'sample-table';

const dynamodbDocumentClient = new DynamoDB.DocumentClient({
  apiVersion: DYNAMODB_API_VERSION,
  region: REGION,
});

(async () => {
  const params: DynamoDB.DocumentClient.UpdateItemInput = {
    TableName: TABLE_NAME,
    Key: {
      pk: 'sample-id',
      sk: 1,
    },
    UpdateExpression: 'set cnt = cnt + 1',
  };

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

UnhandledPromiseRejectionWarning: ValidationException: Invalid UpdateExpression: Syntax error; token: "1", near: "+ 1"

以上。