Ce face find() cu proiecție
Proiecția spune serverului ce câmpuri să trimită înapoi. Cu { client: 1, total: 1 } primești doar acele câmpuri (plus _id, inclus implicit). Cu { produse: 0 } primești totul, mai puțin câmpul exclus. Documentele mai mici înseamnă mai puțin trafic în rețea și mai puțină memorie în aplicație.
Nu poți amesteca includeri și excluderi în aceeași proiecție; singura excepție este _id: 0, permis lângă includeri. Pentru tablouri, $slice întoarce doar primele (sau ultimele, cu număr negativ) n elemente. Din MongoDB 4.4 proiecția acceptă și expresii de agregare.
Parametri
| Parametru | Descriere |
|---|---|
camp: 1 |
Include câmpul. |
camp: 0 |
Exclude câmpul. |
_id: 0 |
Ascunde _id (singura excludere permisă lângă includeri). |
{ $slice: n } |
Doar primele n elemente ale unui tablou (n negativ = ultimele). |
Ce returnează
Un cursor cu documentele găsite, care conțin doar câmpurile cerute.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
use magazin
db.comenzi.insertMany([
{ _id: 1, client: 'Ana', oras: 'Iași', total: 120, status: 'livrata', produse: ['caiet', 'pix'] },
{ _id: 2, client: 'Dan', oras: 'Cluj', total: 85, status: 'noua', produse: ['carte'] },
{ _id: 3, client: 'Ioana', oras: 'Iași', total: 240, status: 'livrata', produse: ['rucsac', 'caiet', 'pix'] },
{ _id: 4, client: 'Mihai', oras: 'Brașov', total: 60, status: 'anulata', produse: [] }
])
Exemplul 1: Doar clientul și totalul comenzilor din Iași
_id apare pentru că nu l-am exclus.
db.comenzi.find({ oras: 'Iași' }, { client: 1, total: 1 })
Ieșire în mongosh
[
{ _id: 1, client: 'Ana', total: 120 },
{ _id: 3, client: 'Ioana', total: 240 }
]
Exemplul 2: Tot documentul, fără câmpuri mari
Excludem tabloul produse și _id.
db.comenzi.find({ status: 'livrata' }, { produse: 0, _id: 0 })
Ieșire în mongosh
[
{ client: 'Ana', oras: 'Iași', total: 120, status: 'livrata' },
{ client: 'Ioana', oras: 'Iași', total: 240, status: 'livrata' }
]
Exemplul 3: Primele două produse dintr-o comandă
$slice: 2 taie tabloul la primele două elemente.
db.comenzi.find({ _id: 3 }, { client: 1, produse: { $slice: 2 } })
Ieșire în mongosh
[ { _id: 3, client: 'Ioana', produse: [ 'rucsac', 'caiet' ] } ]
Greșeli frecvente
{ client: 1, total: 0 }dă eroarea „Cannot do exclusion on field total in inclusion projection”: alege fie includeri, fie excluderi.- Câmpurile care lipsesc dintr-un document nu apar în rezultat, chiar dacă le-ai inclus în proiecție.
- Proiecția nu filtrează documentele: pentru asta este primul argument, filtrul.
Comenzi înrudite
distinct(): Întoarce valorile unice ale unui câmp din colecție, opțional doar pentru documentele care se potrivesc unui filtru.$project: Etapa $project alege, redenumește sau calculează câmpurile documentelor care merg mai departe în pipeline.$exists: Operatorul $exists găsește documentele care au (true) sau nu au (false) un anumit câmp, indiferent de valoarea lui.