$type în MongoDB & NoSQL

Operatorul $type găsește documentele în care un câmp are un anumit tip BSON: string, number, date, null, array etc.

Sintaxă
{ <camp>: { $type: <tip BSON> | [ <tip>, ... ] } }

Ce face $type

$type filtrează după tipul valorii, nu după valoare. E foarte util pentru curățarea datelor: de exemplu vârste salvate din greșeală ca text ('35') în loc de număr. Tipul se scrie ca nume ('string', 'double', 'int', 'long', 'date', 'null', 'array', 'object') sau ca număr BSON.

Aliasul 'number' (din MongoDB 3.2) acoperă toate tipurile numerice: int, long, double și decimal. Poți da și o listă de tipuri, iar documentul se potrivește dacă are oricare dintre ele.

Parametri

Parametru Descriere
'string', 'int', 'double', ... Numele tipului BSON.
'number' Orice tip numeric.
[ tip1, tip2 ] Oricare dintre tipurile date.

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: Vârste salvate greșit ca text

Mihai are varsta: '35', un șir de caractere.

db.clienti.find({ varsta: { $type: 'string' } })

Ieșire în mongosh

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

Exemplul 2: Orice tip numeric

În mongosh, 28 se salvează ca double, dar 'number' îl găsește oricum.

db.clienti.find({ varsta: { $type: 'number' } }, { nume: 1 })

Ieșire în mongosh

[ { _id: 3, nume: 'Ioana' } ]

Exemplul 3: Doar valorile null explicite

Spre deosebire de { email: null }, aici nu apare Mihai, care nu are câmpul.

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

Ieșire în mongosh

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

Greșeli frecvente

  • În mongosh, numerele scrise simplu (28) sunt double; { $type: 'int' } nu le găsește. Folosește 'number' sau salvează cu NumberInt(28).
  • Pentru câmpuri tablou, $type verifică și elementele tabloului; { $type: 'array' } verifică tabloul însuși.

Comenzi înrudite

  • $exists: Operatorul $exists găsește documentele care au (true) sau nu au (false) un anumit câmp, indiferent de valoarea lui.
  • db.createCollection(): Creează explicit o colecție, cu opțiuni: validare cu $jsonSchema, colecție capped, time series sau colație.
  • $expr: Operatorul $expr permite expresii de agregare în find(), de exemplu compararea a două câmpuri din același document.