DocumentClientを利用したDynamoDBの取得・登録・更新・削除

AWS CDKでの開発で、DynamoDBを操作する機会があったためメモとして残しておきます。

DocumentClientとは?

AWS公式には以下のように記載されています。

DynamoDB ドキュメントクライアントは、属性値の概念を抽象化することによって項目の操作を簡素化します。この抽象化は、入力パラメータとして提供されるネイティブの JavaScript 型に注釈を付け、注釈付きのレスポンスデータをネイティブの JavaScript 型に変換します。

https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/dynamodb-example-document-client.html

要するに、AWS.DynamoDBをラップして、より簡単にDynamoDBを操作できるというもののようです。何が違うのかというと、AttributeValuesが不要になり、ネイティブなJavaScriptのコードで記述できるようになります。

条件を指定して合致するレコードを全件取得

条件を指定して検索するには、queryメソッドを使用します。下記の例は、userIdが特定の値のレコードを取得するコードです。

import * as AWS from 'aws-sdk';

const db = new AWS.DynamoDB.DocumentClient();
const TABLE_NAME=process.env.TABLE_NAME || "";

export const handler = async (event: any,): Promise<any> => {

  const userId = 'testuser';

  const params = {
    TableName:TABLE_NAME,
    KeyConditionExpression: 'userId = :userId',
    ExpressionAttributeValues:{
      ':userId':userId
    }
  }

  try{
    const data = await db.query(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(data)
    };
  }catch(e){
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
}

レコードを1件取得

1件だけ取得する場合はパラメータとしてキーを指定し、getメソッドを使用します。userIdとtaskIdでレコードが一意に決まる場合に、そのレコードを取得する例です。

import * as AWS from 'aws-sdk';

const db = new AWS.DynamoDB.DocumentClient();
const TABLE_NAME=process.env.TABLE_NAME || "";

export const handler = async (event: any,): Promise<any> => {
  const userId = 'testuser';
  const taskId = '1';

  const params = {
    TableName:TABLE_NAME,
    Key:{
      userId:userId,
      taskId:taskId
    }
  }

  try{
    const data = await db.get(params).promise();
    return {
      statusCode: 200,
      body: JSON.stringify(data)
    };
  }catch(e){
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
}

レコードの登録

登録するときはputメソッドを使用します。テーブル名と、項目名、項目の値を指定して登録します。

import * as AWS from 'aws-sdk';

const db = new AWS.DynamoDB.DocumentClient();
const TABLE_NAME=process.env.TABLE_NAME || "";

export const handler = async (event: any,): Promise<any> => {

  const requestBody = JSON.parse(event.body);
  const userId = 'testuser';

  const taskId = '1';
  const title = requestBody.title;
  const content = requestBody.content;
  const date = Date.now();

  const params = {
    TableName:TABLE_NAME,
    Item:{
      userId:userId,
      taskId:taskId,
      title:title,
      content:content,
      createDt:date,
      updateDt:date
    }
  }

  try{
    await db.put(params).promise();
    return {
      statusCode: 200,
      body: ''
    };
  }catch(e){
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
}

レコードの更新

更新するときはupdateメソッドを使用します。UpdateExpressionでSQL文のようなクエリを指定し、ExpressionAttributeValuesに埋め込む値を設定します。

import * as AWS from 'aws-sdk';

const db = new AWS.DynamoDB.DocumentClient();
const TABLE_NAME=process.env.TABLE_NAME || "";

export const handler = async (event: any,): Promise<any> => {
  const userId = 'testuser';
  const taskId = '1';
  const date = Date.now();

  const params = {
    TableName:TABLE_NAME,
    Key:{
      userId:userId,
      taskId:taskId
    },
    UpdateExpression:'set updateDt = :updateDt',
    ExpressionAttributeValues:{
      ':updateDt':date,
    },
  }

  try{
    await db.update(params).promise();
    return {
      statusCode: 200,
      body: ''
    };
  }catch(e){
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
}

レコードの削除

削除するときはdeleteメソッドを使用します。getメソッドと同じように、キーを指定します。

import * as AWS from 'aws-sdk';

const db = new AWS.DynamoDB.DocumentClient();
const TABLE_NAME=process.env.TABLE_NAME || "";

export const handler = async (event: any,): Promise<any> => {

  const userId = 'testuser';
  const taskId = '1';

  const params = {
    TableName:TABLE_NAME,
    Key:{
      userId:userId,
      taskId:taskId
    }
  }

  try{
    await db.delete(params).promise();
    return {
      statusCode: 200,
      body: ''
    };
  }catch(e){
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }
}

まとめ

DocumentClientを使用すると、AWS.DynamoDBよりも直感的にCRUD操作ができると感じました。

今後もDocumentClientを使いこなして、良いDynamoDBライフを送れるようになりたいです!

コメントする

メールアドレスが公開されることはありません。