Filter Expression can only contain non-primary key attributes
TL;DR — FilterExpression の中に プライマリキー属性(照会しているテーブルまたはインデックスのパーティションキーやソートキー)を入れました。DynamoDB はそれを禁止します: キー属性は KeyConditionExpression に、フィルターは 非キー 属性のみを参照できます。キー条件をあるべき場所に移してください。
意味
ValidationException: Filter Expression can only contain non-primary key attributes:
Primary key attribute: <name>
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Filter Expression can only contain non-primary key attributes: Primary key attribute: pkFilterExpression はアイテムが読み取られた 後 に実行され、不要な行を破棄します。KeyConditionExpression は 前 に実行され、どのアイテムをキーで読み取るかを選択します。フィルターでパーティション/ソートキーを参照するとそれらの役割が混ざるため、DynamoDB は HTTP 400 の ValidationException で拒否します。再構成するまで クライアント側の問題でリトライ不可 です。
発生する理由
- フィルターとして書かれたキー条件 —
skがソートキーなのにFilterExpression: 'sk = :v'。それはKeyConditionExpressionに属します。 - インデックスのキーでのフィルタリング — GSI/LSI を
Queryするとき、そのインデックス自身のパーティション/ソートキーはこのクエリにとって「プライマリキー属性」であり、フィルターに現れることはできません。 - フィルタされた属性の1つがたまたまキーである スキャンフィルターをクエリにコピペ している。
- キー条件で表現する代わりに、フィルター経由でソートキーに2つ目の条件(例: 範囲)を 追加しようとしている。
修正方法
- キー条件を
KeyConditionExpressionに移します:KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)', // FilterExpression: only NON-key attributes, e.g. 'status = :active' - 正しいインデックスを使います。 キーでない属性でフィルタ/選択する必要がある場合、それを GSI のパーティション/ソートキーとしてモデリングし、そのインデックスをキーで照会します。
- フィルターは非キー属性のみに保ちます — 結果を絞りますが、スキャンされたすべてのアイテムに対して読み取りキャパシティを消費するため、選択にはキー/インデックスに頼りましょう。
- GSI を照会していますか? そのキー属性もフィルターでは禁止されていることを忘れないでください。キー条件でそれらを条件付けます。
DynoTable で実行する
DynoTable のクエリパネルは、キー条件とフィルターを別々のフィールドに分けています — パーティションキーとソートキーの条件が FilterExpression に紛れ込むことはありません。⌘K でテーブルを開き、キー条件を設定してから、キー以外のフィルターを追加してください。生成されたリクエストはそのまま SDK にコピーできます。
インデックスのキーを KeyConditionExpression に置いたままにしなければならない GSI クエリは、クエリビルダーで試作しましょう。プロファイルの切り替えは ⌘P、Settings → Profiles の Test Connection がインデックスの存在を確認してくれます。AWS に接続するとインストールを参照してください。
出典
- Query — Amazon DynamoDB API Reference (2026-07-13 時点で検証)
- Filter expressions for Query (2026-07-13 時点で検証)
関連するエラー
- Query key condition not supported — キー条件自体の無効な演算子/形状。
- Query condition missed key schema element — クエリがパーティションキーを渡さなかった。
- Code example: Query in Node.js — キー条件とフィルターが正しく分割されている。
- 学習: フィルタリング戦略 · キー条件式
参考資料
- Query — Amazon DynamoDB API Reference
- Filter expressions for Query — Amazon DynamoDB Developer Guide
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。