distinct() în MongoDB & NoSQL

Operațiuni CRUD MongoDB 1.x

Întoarce valorile unice ale unui câmp din colecție, opțional doar pentru documentele care se potrivesc unui filtru.

Sintaxă
db.colectie.distinct(camp, filtru, optiuni)

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 distinct trebuie să încapă într-un singur document BSON (16 MB). Pentru câmpuri cu foarte multe valori, folosește aggregate cu $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.