【DynamoDB】begins_with部分一致はFilterExpressionでも使用可能!

  • 2024-09-04
【DynamoDB】begins_with部分一致はFilterExpressionでも使用可能!

DynamoDBでbegins_withを使用して前方一致検索を行う方法

はじめに

Amazon DynamoDBは、AWSが提供する高速でスケーラブルなNoSQLデータベースサービスです。アプリケーションでデータを効率的に操作するためには、クエリの使い方を理解することが重要です。

この記事では、DynamoDBでbegins_with関数を使用して前方一致検索を行う方法について解説します。さらに、Node.jsとAWS SDKを使用して、実際にクエリを実行するコード例も紹介します。


begins_withとは?

begins_withは、DynamoDBの条件式で使われる関数の一つです。この関数を使用すると、特定の文字列で始まる項目を検索することができます。

たとえば、テーブル内の「名前」属性が「Joh」で始まるすべての項目を検索したい場合に、begins_withを使用します。


begins_withの使い方

DynamoDBでbegins_withを使用する方法は2つあります:

  1. FilterExpressionを使用する方法
  2. KeyConditionExpressionを使用する方法

1. FilterExpressionを使用した前方一致検索

FilterExpressionは、スキャンまたはクエリの結果をフィルタリングするために使用されます。このフィルターは、すべての項目が読み込まれた後で適用されるため、大規模なデータセットに対してはコストが高くなる可能性があります。

例: 名前が「Joh」で始まる項目を検索する

以下のコードは、DynamoDBテーブルをスキャンして、名前が「Joh」で始まる項目を取得する方法を示しています。

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: 'YourTableName',
  FilterExpression: 'begins_with(#name, :prefix)',
  ExpressionAttributeNames: {
    '#name': 'name', // 属性名が予約語の場合にはプレースホルダーを使用
  },
  ExpressionAttributeValues: {
    ':prefix': 'Joh',
  },
};

dynamoDb.scan(params, (err, data) => {
  if (err) {
    console.error('Unable to scan the table. Error JSON:', JSON.stringify(err, null, 2));
  } else {
    console.log('Scan succeeded.');
    data.Items.forEach(item => console.log(item));
  }
});

2. KeyConditionExpressionを使用した前方一致検索

KeyConditionExpressionは、パーティションキーとソートキーを使用したクエリに使用されます。begins_withをソートキーに使用することで、効率的に前方一致検索を行うことができます。

例: ユーザーIDが特定の値で、名前が「Joh」で始まる項目を検索する

const AWS = require('aws-sdk');
const dynamoDb = new AWS.DynamoDB.DocumentClient();

const params = {
  TableName: 'YourTableName',
  KeyConditionExpression: '#userId = :userId and begins_with(#name, :prefix)',
  ExpressionAttributeNames: {
    '#userId': 'userId', // パーティションキーの属性名
    '#name': 'name',     // ソートキーの属性名
  },
  ExpressionAttributeValues: {
    ':userId': 'specificUserId',
    ':prefix': 'Joh',
  },
};

dynamoDb.query(params, (err, data) => {
  if (err) {
    console.error('Unable to query the table. Error JSON:', JSON.stringify(err, null, 2));
  } else {
    console.log('Query succeeded.');
    data.Items.forEach(item => console.log(item));
  }
});

まとめ

begins_withを使用することで、DynamoDBで特定の文字列で始まる項目を効率的に検索することができます。
特に、KeyConditionExpressionを使用した場合、パーティションキーとソートキーを組み合わせることで、効率的にデータを取得することが可能です。

しかし、FilterExpressionを使用する場合は、全件読み込み後のフィルタリングとなるため、大量のデータに対しては注意が必要です。
クエリの設計を行う際には、効率を考慮した構成を検討しましょう。

この記事で紹介したコード例をもとに、皆さんもDynamoDBでのクエリを効率的に実行してみてください!


参考資料


この記事を参考に、DynamoDBのクエリを最大限に活用してください。Happy coding!