Filter Expression can only contain non-primary key attributes

TL;DR — Bir FilterExpression içine bir birincil anahtar özniteliği (bölüm anahtarı ya da sıralama anahtarı — tablonun ya da sorguladığınız indeksin) koydunuz. DynamoDB bunu yasaklar: anahtar öznitelikleri KeyConditionExpression'a gider ve bir filtre yalnızca anahtar olmayan özniteliklere başvurabilir. Anahtar koşulunu ait olduğu yere taşıyın.

Ne anlama gelir

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, istemediğiniz satırları atmak için öğeler okunduktan sonra çalışır; KeyConditionExpression, hangi öğelerin anahtara göre okunacağını seçmek için önce çalışır. Filtrede bir bölüm/sıralama anahtarına başvurmak bu rolleri karıştırır, bu yüzden DynamoDB onu bir HTTP 400 ValidationException ile reddeder — yeniden yapılandırana kadar istemci tarafında ve yeniden denenebilir değildir.

Neden olur

  • Bir filtre olarak yazılmış bir anahtar koşulusk'nin sıralama anahtarı olduğu FilterExpression: 'sk = :v'; KeyConditionExpression'a aittir.
  • İndeksin anahtarında filtreleme — bir GSI/LSI'yi Query ettiğinizde, o indeksin kendi bölüm/sıralama anahtarı bu sorgu için "birincil anahtar öznitelikleridir" ve filtrede görünemez.
  • Filtrelenen bir özniteliğin bir anahtar olduğu bir tarama filtresini bir sorguya kopyala-yapıştırmak.
  • Anahtar koşulunda ifade etmek yerine filtre aracılığıyla sıralama anahtarında ikinci bir koşul (örneğin bir aralık) eklemeye çalışmak.

Nasıl düzeltilir

  1. Anahtar koşullarını KeyConditionExpression'a taşıyın:
    KeyConditionExpression: 'pk = :pk AND begins_with(sk, :prefix)',
    // FilterExpression: only NON-key attributes, e.g. 'status = :active'
  2. Doğru indeksi kullanın. Bir anahtar olmayan bir öznitelikte filtrelemeniz/seçmeniz gerekiyorsa, onu bir GSI'nin bölüm/sıralama anahtarı olarak modelleyin ve o indeksi anahtara göre sorgulayın.
  3. Filtreyi yalnızca anahtar olmayan öznitelikler için tutun — sonuçları kırpar ama taranan her öğe için hâlâ okuma kapasitesi tüketir, bu yüzden seçim için anahtarlara/indekslere dayanın.
  4. Bir GSI mi sorguluyorsunuz? Onun anahtar özniteliklerinin filtrede de yasak olduğunu unutmayın — onlar üzerinde anahtar koşulunda koşullandırın.

DynoTable'da çalıştırın

DynoTable'un sorgu paneli temel koşulları ve filtreleri ayrı alanlarda tutar; bölümleme ve sıralama anahtarı kısıtlamaları hiçbir zaman FilterExpression'e ulaşmaz. ⌘K ile bir tablo açın, anahtar koşulunu ayarlayın, ardından anahtar olmayan filtreler ekleyin; oluşturulan isteği SDK'nıza kopyalayın.

Dizin anahtarlarının KeyConditionExpression'de kalması gereken GSI sorgularının prototipini oluşturmak için Query Builder'yi kullanın. Profilleri ⌘P ile değiştirin; Ayarlar → Profiller'deki Bağlantıyı Test Et, dizinin var olduğunu doğrular. Bkz. Connect to AWS ve Install.

Kaynaklar

İlgili hatalar

Kaynaklar

En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.

Console olmadan DynamoDB ile çalış

DynamoDB’nin çalıştıramadığı gerçek SQL’i çalıştıran hızlı bir DynamoDB masaüstü istemcisi — JOINs, GROUP BY, toplamalar — görsel düzenleme ve kendi Bedrock anahtarların üzerinde bir yapay zekâ aracısıyla.

30 günlük ücretsiz deneme, kredi kartı yok — ardından süre sınırı olmayan Ücretsiz plan.