Node.js (AWS SDK v3) での DynamoDB GSI のクエリ
グローバルセカンダリインデックスのクエリは、通常の Query にパラメーターを1つ加えたものです: IndexName。キー条件はテーブルのキーではなくインデックスのキーを対象とします。ここでは AlbumTitle-index によってアルバムで曲を取得できます。これは、ベーステーブル(Artist + SongTitle)ではスキャンなしには対応できないアクセスパターンです。
Code
import {DynamoDBClient, QueryCommand} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({region: 'us-east-1'});
const items = [];
let lastEvaluatedKey;
do {
const response = await client.send(
new QueryCommand({
TableName: 'Music',
IndexName: 'AlbumTitle-index',
KeyConditionExpression: '#hashKey = :hashKeyValue',
ExpressionAttributeNames: {
'#hashKey': 'AlbumTitle'
},
ExpressionAttributeValues: {
':hashKeyValue': {S: 'Danzon'}
},
ExclusiveStartKey: lastEvaluatedKey
})
);
items.push(...(response.Items ?? []));
lastEvaluatedKey = response.LastEvaluatedKey;
} while (lastEvaluatedKey);
console.log(`Found ${items.length} songs on the album`);Explanation
IndexName— クエリする GSI を指定します(TableNameは依然として必須)。KeyConditionExpressionはインデックスのパーティション(および任意でソート)キー — ここではAlbumTitle— を、テーブルクエリと同じ演算子で使います。- 結果整合性のみ — GSI はベーステーブルから非同期にレプリケーションされます。GSI クエリで
ConsistentRead: trueを渡してもアップグレードされず、ValidationExceptionで失敗します。(ローカルセカンダリインデックスは強い整合性をサポートします。) - 投影された属性のみ取得できる — GSI クエリはインデックスが投影するもの(
ALL、KEYS_ONLY、またはINCLUDEで列挙された属性)を返し、残りをベーステーブルから取得することはできません。投影されていない属性が必要ですか?テーブルキーに対するGetItemで追跡するか、投影を広げましょう。 - GSI ではキーは一意ではない — 多くのアイテムが同じインデックスキーを共有でき、インデックスキー属性を持たないアイテムは単に現れません(これがスパースインデックスのパターンです)。
- ページネーション — テーブルクエリと同一です。ページごとに最大 1 MB で、
LastEvaluatedKey→ExclusiveStartKeyをundefinedになるまでループします。
Do it visually
DynamoDB Expression Builder はインデックスクエリのためにキー条件 + 名前/値のマップを構築し、コードをコピーします。
テーブルのインデックスを参照し、フォームから GSI クエリを実行するには(ページネーションされたグリッド、生成された SDK v3 コードのコピー)、DynoTable をダウンロードしてください。
Related examples
- DynamoDB Query a GSI in Python — boto3 による同じインデックスクエリ。
- DynamoDB Query a GSI with the AWS CLI — シェルからの同じインデックスクエリ。
- DynamoDB Query in Node.js — ベーステーブルのクエリ。
- GSI vs. LSI — アクセスパターンに合うインデックスの種類。
- Why GSIs are eventually consistent — レプリケーション遅延の解説。
- "The table does not have the specified index" — インデックス名が一致しない(GSI 名は大文字小文字を区別します)。
- "Consistent reads are not supported on global secondary indexes" — なぜ consistent-read フラグが GSI で失敗するのか。
References
- Query — Amazon DynamoDB API Reference
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
- Paginating table query results — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。