$size în MongoDB & NoSQL

Operatorul $size găsește documentele în care un tablou are exact numărul dat de elemente.

Sintaxă
{ <camp>: { $size: <numar> } }

Ce face $size

{ produse: { $size: 0 } } găsește comenzile cu tabloul produse gol, iar { $size: 2 } pe cele cu exact două produse. Câmpurile care nu sunt tablouri nu se potrivesc.

$size acceptă doar un număr exact, nu intervale ($gt nu merge înăuntru). Pentru „cel puțin 3 elemente” verifici dacă există elementul cu indicele 2 ('produse.2': { $exists: true }) sau folosești $expr cu operatorul de agregare $size.

Parametri

Parametru Descriere
numar Numărul exact de elemente.

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.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: Comenzi fără produse

Comanda anulată a lui Mihai are tabloul gol.

db.comenzi.find({ produse: { $size: 0 } }, { client: 1, status: 1 })

Ieșire în mongosh

[ { _id: 4, client: 'Mihai', status: 'anulata' } ]

Exemplul 2: Comenzi cu cel puțin trei produse

Dacă există elementul de pe poziția 2 (al treilea), tabloul are minim trei elemente.

db.comenzi.find({ 'produse.2': { $exists: true } }, { client: 1 })

Ieșire în mongosh

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

Greșeli frecvente

  • { produse: { $size: { $gt: 1 } } } dă eroare: $size primește doar un număr.
  • $size nu poate folosi un index. Dacă filtrezi des după lungime, salvează lungimea într-un câmp separat (de exemplu nrProduse) și indexează-l.

Comenzi înrudite

  • $all: Operatorul $all găsește documentele în care un tablou conține toate valorile date, în orice ordine.
  • $expr: Operatorul $expr permite expresii de agregare în find(), de exemplu compararea a două câmpuri din același document.
  • $exists: Operatorul $exists găsește documentele care au (true) sau nu au (false) un anumit câmp, indiferent de valoarea lui.