$exists în MongoDB & NoSQL

Operatorul $exists găsește documentele care au (true) sau nu au (false) un anumit câmp, indiferent de valoarea lui.

Sintaxă
{ <camp>: { $exists: true | false } }

Ce face $exists

Într-o colecție MongoDB, documentele nu trebuie să aibă aceleași câmpuri. { telefon: { $exists: true } } găsește documentele care au câmpul telefon, chiar dacă valoarea lui este null. Cu false găsești documentele în care câmpul lipsește complet.

Diferența față de { email: null } este importantă: filtrul cu null găsește și documentele cu valoarea null, și pe cele fără câmp. Dacă vrei doar valorile null explicite, folosește { $type: 'null' }.

Parametri

Parametru Descriere
true Câmpul există (orice valoare, inclusiv null).
false Câmpul lipsește.

Ce returnează

Un cursor cu documentele găsite.

Exemple

Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.

use magazin
db.clienti.insertMany([
  { _id: 1, nume: 'Ana', email: 'ana@exemplu.ro', telefon: '0722000111' },
  { _id: 2, nume: 'Dan', email: null },
  { _id: 3, nume: 'Ioana', email: 'ioana@exemplu.ro', varsta: 28 },
  { _id: 4, nume: 'Mihai', varsta: '35' }
])

Exemplul 1: Clienții care și-au lăsat telefonul

Doar Ana are câmpul telefon.

db.clienti.find({ telefon: { $exists: true } }, { nume: 1 })

Ieșire în mongosh

[ { _id: 1, nume: 'Ana' } ]

Exemplul 2: Clienții fără câmpul email

Dan are email: null, deci câmpul există; doar Mihai nu îl are deloc.

db.clienti.find({ email: { $exists: false } }, { nume: 1 })

Ieșire în mongosh

[ { _id: 4, nume: 'Mihai' } ]

Exemplul 3: Comparație: filtrul cu null

{ email: null } găsește ambele cazuri: valoare null și câmp lipsă.

db.clienti.find({ email: null }, { nume: 1 })

Ieșire în mongosh

[ { _id: 2, nume: 'Dan' }, { _id: 4, nume: 'Mihai' } ]

Greșeli frecvente

  • $exists: true nu înseamnă „are o valoare utilă”: include și null și șirul gol. Combină cu $ne: null dacă ai nevoie.
  • Un index obișnuit nu ajută mult la $exists: false; pentru câmpuri opționale folosește un index sparse sau parțial.

Comenzi înrudite

  • $type: Operatorul $type găsește documentele în care un câmp are un anumit tip BSON: string, number, date, null, array etc.
  • find() cu proiecție: Al doilea argument al lui find() alege ce câmpuri întoarce interogarea: 1 = include, 0 = exclude.
  • $size: Operatorul $size găsește documentele în care un tablou are exact numărul dat de elemente.