DynamoDB — cannot specify projection when Select is COUNT
TL;DR — Query/Scan'iniz Select: COUNT ile bir ProjectionExpression (ya da eski AttributesToGet) ayarladı. COUNT yalnızca eşleşen öğe sayısını döndürür, asla öğelerin kendisini değil, dolayısıyla döndürülecek öznitelikleri adlandırmak çelişkilidir — DynamoDB onu reddeder. Birini seçin: projeksiyon olmadan Select: COUNT ya da Select: SPECIFIC_ATTRIBUTES (bir ProjectionExpression sağladığınızda varsayılan) ile bir projeksiyon.
Ne anlama gelir
ValidationException: 1 validation error detected: Cannot specify the AttributesToGet when choosing to get only the Count
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: 1 validation error detected: Cannot specify the ProjectionExpression when choosing to get only the Count(Bu, eski AttributesToGet parametresiyle olan mesajdır; ProjectionExpression ile ifade farklıdır ama kural aynıdır.) Select, bir okumanın ne döndüreceğini kontrol eder. COUNT, DynamoDB'den bir toplam (Count/ScannedCount) ister ve öğe verisi istemez. Bir ProjectionExpression/AttributesToGet, döndürülen öğelerin belirli özniteliklerini ister. Bu ikisi karşılıklı dışlar — Query API referansı bunu açıkça belirtir: "ProjectionExpression parametresini kullanırsanız, Select değeri yalnızca SPECIFIC_ATTRIBUTES olabilir. Select için başka herhangi bir değer bir hata döndürür." Bir maliyet notu: COUNT yine de öğeleri gerçekten getirmekle aynı okuma kapasitesini tüketir — RCU'ları değil, bant genişliğini tasarruf eder.
Neden olur
- Her iki parametre aynı anda ayarlanmış — bir
ProjectionExpressioneklenirken (ya da tersi)Select: COUNTyerinde bırakılmış. Select: COUNTile birleştirilmiş eskiAttributesToGet.- Çağıran yalnızca bir sayı istese bile her zaman bir projeksiyon ekleyen bir sorgu oluşturucu.
Select'i yanlış anlamak —COUNT'un saydığı öğeleri de geri vermesini beklemek.
Nasıl düzeltilir
- Yalnızca sayıyor musunuz? Projeksiyonu bırakın.
Select: COUNTayarlayın veProjectionExpression/AttributesToGet'i kaldırın. - Belirli özniteliklere mi ihtiyacınız var?
Select: COUNT'u bırakın. BirProjectionExpressionsağlayın; DynamoDBSelect'i varsayılan olarakSPECIFIC_ATTRIBUTESyapar, dolayısıyla genellikleSelect'i hiç ayarlamazsınız. - Hem sayıya hem öğelere mi ihtiyacınız var? Öğeler için bir çağrı yapın (projeksiyonunuzla) ve
Count'unu okuyun ya da ayrı birSelect: COUNTçağrısı yapın. AttributesToGetyerineProjectionExpression'ı tercih edin — AWSAttributesToGet'i eski bir parametre olarak işaretler ve bunun yerineProjectionExpression'ı önerir.
Keşfederken yalnızca hızlı bir sayı ya da projelenmiş bir görünüm mü istiyorsunuz? DynoTable masaüstü uygulaması, çelişen Select parametrelerini elle birleştirmenize gerek kalmadan sorgular çalıştırır ve eşleşen sayıyı gösterir.
DynoTable’da aç
DynoTable'in sorgu paneli sayım modunu projeksiyondan ayırır; seçilen niteliklere sahip öğeleri getirirsiniz veya eşleşen sayıyı okursunuz; asla her ikisi birden çakışan bir istekte olmaz. ⌘K ile bir tablo açın, bir Sorgu çalıştırın ve ProjectionExpression eklemeden durum çubuğundaki sonuç sayısını kontrol edin.
SDK kodunuz için yalnızca projeksiyon veya yalnızca sayım isteği oluşturmak için Query Builder tuşunu kullanın. Profilleri ⌘P ile değiştirin; bunları Ayarlar → Profiller altında Bağlantıyı Test Et ile yapılandırın. Bkz. Connect to AWS ve Install.
Kaynaklar
- Query — Amazon DynamoDB API Reference (2026-07-13 tarihinde doğrulandı)
- AttributesToGet (legacy) (2026-07-13 tarihinde doğrulandı)
İlgili hatalar
- Cannot use both expression and non-expression parameters — eski ve ifade parametrelerini karıştırmak.
- Query key condition not supported — aynı istekte hatalı biçimlendirilmiş bir anahtar koşulu.
- Öğrenin: Count, sum & aggregate · Projection expressions
Kaynaklar
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
- AttributesToGet (legacy) — Amazon DynamoDB Developer Guide
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
En son 2026-07-13 tarihinde yukarıda bağlantısı verilen resmi AWS belgelerine karşı doğrulandı.