Ce face distinct()
distinct('oras') parcurge documentele și întoarce o listă cu fiecare valoare a câmpului o singură dată. Dacă câmpul este un tablou, fiecare element al tabloului contează ca valoare separată.
Al doilea argument este un filtru, ca la find(). Rezultatul este un tablou obișnuit, deci poți folosi .length ca să afli câte valori distincte există. Pentru numărare pe valori (câte comenzi are fiecare oraș), folosește $group sau $sortByCount.
Parametri
| Parametru | Descriere |
|---|---|
camp |
Numele câmpului (acceptă și câmpuri imbricate: 'adresa.oras'). |
filtru |
Opțional: doar documentele care se potrivesc. |
optiuni |
Opțional, de exemplu { collation: { locale: 'ro' } }. |
Ce returnează
Un tablou cu valorile distincte.
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: Orașele din care avem comenzi
Fiecare oraș apare o dată, chiar dacă Iași are două comenzi.
db.comenzi.distinct('oras')
Ieșire în mongosh
[ 'Brașov', 'Cluj', 'Iași' ]
Exemplul 2: Produsele din comenzile livrate
Câmpul produse este tablou, așa că fiecare element contează separat.
db.comenzi.distinct('produse', { status: 'livrata' })
Ieșire în mongosh
[ 'caiet', 'pix', 'rucsac' ]
Exemplul 3: Câte orașe distincte
Rezultatul este un tablou JavaScript, deci are .length.
db.comenzi.distinct('oras').length
Ieșire în mongosh
3
Greșeli frecvente
- Rezultatul
distincttrebuie să încapă într-un singur document BSON (16 MB). Pentru câmpuri cu foarte multe valori, foloseșteaggregatecu$group. 'Iasi'și'Iași'sunt valori diferite. Curăță datele sau folosește o colație dacă vrei să le tratezi la fel.
Comenzi înrudite
$group: Etapa $group grupează documentele după o cheie și calculează totaluri: $sum, $avg, $min, $max, $push, $addToSet.find() cu proiecție: Al doilea argument al lui find() alege ce câmpuri întoarce interogarea: 1 = include, 0 = exclude.$count / $sortByCount: Etapa $count numără documentele ajunse în acel punct al pipeline-ului; $sortByCount numără pe valori și ordonează descrescător.