DynamoDB — impossible de spécifier une projection quand Select vaut COUNT

TL;DR — Ton Query/Scan a défini Select: COUNT et une ProjectionExpression (ou l'ancien AttributesToGet). COUNT ne renvoie que le nombre d'éléments correspondants, jamais les éléments eux-mêmes, donc nommer des attributs à retourner est contradictoire — DynamoDB le rejette. Choisis-en un : Select: COUNT sans projection, ou une projection avec Select: SPECIFIC_ATTRIBUTES (la valeur par défaut quand tu fournis une ProjectionExpression).

Ce que ça signifie

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

(C'est le message avec l'ancien paramètre AttributesToGet ; avec ProjectionExpression la formulation diffère, mais la règle est la même.) Select contrôle ce que renvoie une lecture. COUNT demande à DynamoDB un décompte (Count/ScannedCount) et aucune donnée d'élément. Une ProjectionExpression/AttributesToGet demande des attributs spécifiques des éléments renvoyés. Les deux sont mutuellement exclusifs — la référence de l'API Query l'explique clairement : « If you use the ProjectionExpression parameter, then the value for Select can only be SPECIFIC_ATTRIBUTES. Any other value for Select will return an error. » Une note sur le coût : COUNT consomme quand même autant de capacité de lecture que de récupérer réellement les éléments — ça économise de la bande passante, pas des RCU.

Pourquoi ça arrive

  • Les deux paramètres définis en même tempsSelect: COUNT laissé en place pendant qu'une ProjectionExpression était ajoutée (ou l'inverse).
  • L'ancien AttributesToGet combiné avec Select: COUNT.
  • Un générateur de requêtes qui attache toujours une projection, même quand l'appelant ne voulait qu'un décompte.
  • Une mauvaise compréhension de Select — s'attendre à ce que COUNT renvoie aussi les éléments qu'il a comptés.

Comment le corriger

  1. Tu comptes seulement ? Supprime la projection. Définis Select: COUNT et retire ProjectionExpression/AttributesToGet.
  2. Tu as besoin d'attributs spécifiques ? Supprime Select: COUNT. Fournis une ProjectionExpression ; DynamoDB fixe Select par défaut à SPECIFIC_ATTRIBUTES, donc tu n'as généralement pas besoin de définir Select du tout.
  3. Tu as besoin du décompte ET des éléments ? Fais un appel pour les éléments (avec ta projection) et lis son Count, ou fais un appel Select: COUNT séparé.
  4. Préfère ProjectionExpression à AttributesToGet — AWS marque AttributesToGet comme paramètre legacy et recommande ProjectionExpression à la place.

Tu veux juste un décompte rapide ou une vue projetée pendant que tu explores ? L'application de bureau DynoTable exécute des requêtes et affiche le nombre de correspondances sans que tu aies à assembler à la main des paramètres Select contradictoires.

Ouvre-le dans DynoTable

Le panneau de requête de DynoTable sépare le mode comptage de la projection — soit tu récupères des éléments avec des attributs sélectionnés, soit tu lis le nombre de correspondances, jamais les deux dans une même requête contradictoire. Ouvre une table avec ⌘K, lance une Query, et lis le nombre de résultats dans la barre d'état sans attacher de ProjectionExpression.

Sers-toi du Query Builder pour générer une requête en projection seule ou en comptage seul pour ton code SDK. Change de profil avec ⌘P ; configure-les sous Settings → Profiles avec Test Connection. Vois Se connecter à AWS et Installation.

Sources

Erreurs liées

Références

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.