Le principe
La projection est le second argument de find() : un objet qui indique, champ par champ, ce qu'on garde (1) ou ce qu'on retire (0).
db.collection.find( filtre, projection )
Inclusion — ne garder que certains champs
On liste les champs à inclure avec 1. Tous les autres sont exclus (sauf _id, cas particulier).
db.clients.find({}, { nom: 1, points: 1 })
Résultat
Exclusion — tout garder sauf…
À l'inverse, on liste les champs à exclure avec 0. Tous les autres sont conservés.
db.clients.find({}, { adresse: 0 }) // tout sauf l'adresse
_id qu'on peut exclure tout en incluant d'autres champs.Le cas particulier _id
_id est renvoyé par défaut, même en mode inclusion. Pour le masquer, il faut l'exclure explicitement.
db.clients.find({}, { nom: 1, _id: 0 })
Résultat
Projeter une partie d'un tableau
$slice limite le nombre d'éléments renvoyés d'un tableau ; $elemMatch (en projection) ne renvoie que le premier élément qui correspond.
// ne renvoyer que les 2 premières commandes de chaque campagne db.campagnes.find({}, { zone: 1, commandes: { $slice: 2 } }) // ne renvoyer que la commande de Ladignac db.campagnes.find( { }, { commandes: { $elemMatch: { commune: "Ladignac" } } } )
Projeter des champs imbriqués
On cible un champ dans un sous-document avec la notation pointée.
db.clients.find({}, { "nom": 1, "adresse.ville": 1, _id: 0 })
Résultat
Pour l'écran « liste des campagnes », on ne renvoie pas tout : juste zone, statut, dateLimite (projection en inclusion, _id: 0 si inutile). La grosse liste des commandes n'est chargée que sur l'écran de détail. C'est exactement le rôle des DTO côté Spring : décider quoi exposer.
- Projection = 2e argument de
find():1inclut,0exclut. - Pas de mélange inclusion/exclusion (sauf
_id). _idest renvoyé par défaut ;_id: 0pour le masquer.- Tableaux :
$slice,$elemMatch; imbriqué : notation pointée.