L'espressione filtro può contenere solo attributi di chiave non primaria

TL;DR — Inserisci un attributo di chiave primaria (chiave di partizione o chiave di ordinamento) della tabella o dell'indice che stai interrogando) all'interno di un FilterExpression. DynamoDB vieta che: gli attributi chiave vadano nella KeyConditionExpression e un filtro possa fare riferimento solo ad attributi non chiave. Sposta la condizione chiave al suo posto.

Cosa significa

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: pk

FilterExpression viene eseguito dopo che gli elementi sono stati letti, per scartare le righe che non desideri; KeyConditionExpression viene eseguito prima, per selezionare quali elementi vengono letti dalla chiave. Il riferimento a una chiave di partizione/ordinamento nel filtro mescola tali ruoli, quindi DynamoDB lo rifiuta con una ValidationException HTTP 400 — lato client e non riprovabile finché non si ristruttura.

Perché succede

  • Una condizione chiave scritta come filtroFilterExpression: 'sk = :v' dove sk è la chiave di ordinamento; appartiene a "KeyConditionExpression".
  • Filtro sulla chiave dell'indice — quando interroghi un GSI/LSI, la chiave di partizione/ordinamento di quell'indice sono "attributi della chiave primaria" per questa query e non possono apparire nel filtro.
  • Copia e incolla un filtro di scansione su una query in cui un attributo filtrato risulta essere una chiave.
  • Cercando di aggiungere una seconda condizione sulla chiave di ordinamento tramite il filtro (ad esempio un intervallo) invece di esprimerla nella condizione chiave.

Come risolverlo

  1. Sposta le condizioni chiave in "KeyConditionExpression":
    KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)',
    // FilterExpression: only NON-key attributes, e.g. 'status = :active'
  2. Utilizza l'indice corretto. Se è necessario filtrare/selezionare un attributo che non è una chiave, modellarlo come chiave di partizione/ordinamento di un GSI ed eseguire una query sull'indice per chiave.
  3. Mantieni il filtro solo per gli attributi non chiave: riduce i risultati ma consuma comunque capacità di lettura per ogni elemento scansionato, quindi affidati a chiavi/indici per la selezione.
  4. Interrogazione su un GSI? Ricorda che anche i suoi attributi chiave sono vietati nel filtro: condizione su di essi nella condizione chiave.
  5. Controlla le richieste generate. Registra insieme sia "KeyConditionExpression" che "FilterExpression": gli attributi chiave nel filtro sono un errore comune di copia e incolla del codice di scansione.

Eseguilo in DynoTable

Il pannello delle query di DynoTable mantiene le condizioni chiave e i filtri in campi separati: i vincoli delle chiavi di partizione e ordinamento non arrivano mai a "FilterExpression". Apri una tabella con ⌘K, imposta la condizione chiave, quindi aggiungi filtri non chiave; copia la richiesta generata nel tuo SDK.

Utilizza il Query Builder per prototipare GSI query in cui le chiavi dell'indice devono rimanere in "KeyConditionExpression". Cambia profilo con ⌘P; Verifica connessione in Impostazioni → Profili conferma che l'indice esiste. Consulta Connetti a AWS e Installa.

Fonti

Errori correlati

Riferimenti

Ultima verifica il 13-07-2026 rispetto alla documentazione ufficiale del AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.