$all în MongoDB & NoSQL

Operatorul $all găsește documentele în care un tablou conține toate valorile date, în orice ordine.

Sintaxă
{ <camp>: { $all: [ <valoare1>, <valoare2>, ... ] } }

Ce face $all

{ produse: { $all: ['caiet', 'pix'] } } găsește comenzile care au în tabloul produse și caiet, și pix. Ordinea elementelor și existența altor elemente nu contează.

Diferența față de $in: $in cere cel puțin una dintre valori (SAU), iar $all le cere pe toate (ȘI). Spre deosebire de egalitatea exactă { produse: ['caiet', 'pix'] }, $all nu cere ca tabloul să fie identic.

Parametri

Parametru Descriere
[ valori ] Valorile care trebuie să apară toate în tablou.

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 care conțin și caiet, și pix

Comanda Ioanei are și un rucsac, dar asta nu contează.

db.comenzi.find({ produse: { $all: ['caiet', 'pix'] } }, { client: 1, produse: 1 })

Ieșire în mongosh

[
  { _id: 1, client: 'Ana', produse: [ 'caiet', 'pix' ] },
  { _id: 3, client: 'Ioana', produse: [ 'rucsac', 'caiet', 'pix' ] }
]

Exemplul 2: Comparație cu egalitatea exactă

Egalitatea cu un tablou cere aceleași elemente, în aceeași ordine: doar comanda Anei se potrivește.

db.comenzi.find({ produse: ['caiet', 'pix'] }, { client: 1 })

Ieșire în mongosh

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

Greșeli frecvente

  • Pentru tablouri de obiecte, unde mai multe condiții trebuie să fie îndeplinite de același element, folosește $elemMatch.
  • { $all: [] } (tablou gol) nu găsește niciun document.

Comenzi înrudite

  • $size: Operatorul $size găsește documentele în care un tablou are exact numărul dat de elemente.
  • $unwind: Etapa $unwind desface un tablou: produce câte un document pentru fiecare element, ca să-l poți grupa sau filtra.
  • $expr: Operatorul $expr permite expresii de agregare în find(), de exemplu compararea a două câmpuri din același document.