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: pkFilterExpression, 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şulu —
sk'nin sıralama anahtarı olduğuFilterExpression: 'sk = :v';KeyConditionExpression'a aittir. - İndeksin anahtarında filtreleme — bir GSI/LSI'yi
Queryettiğ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
- 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' - 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.
- 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.
- 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
- Query — Amazon DynamoDB API Reference (2026-07-13 tarihinde doğrulandı)
- Filter expressions for Query (2026-07-13 tarihinde doğrulandı)
İlgili hatalar
- Query key condition not supported — anahtar koşulunun kendisinde geçersiz bir operatör/şekil.
- Query condition missed key schema element — sorgu bölüm anahtarını sağlamadı.
- Kod örneği: Query in Node.js — anahtar koşulu ve filtre doğru bölünmüş.
- Öğrenin: Filtering strategies · Key condition expressions
Kaynaklar
- Query — Amazon DynamoDB API Reference
- Filter expressions for Query — Amazon DynamoDB Developer Guide
- Using Global Secondary Indexes in DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.