MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $allElementsTrue

In MongoDB, il $allElementsTrue l'operatore della pipeline di aggregazione valuta un array come un set e restituisce true se nessun elemento nell'array è false .

Se l'array contiene un elemento che è false , quindi $allElementsTrue restituisce false .

L'elemento di un array è true se non è false , null , 0 o undefined .

Esempio

Supponiamo di avere una collezione con il seguente documento:

{ "_id" : 1, "data" : [ 1, 2, 3 ] }

Questo documento contiene un array.

Possiamo eseguire la seguente query con $allElementsTrue per scoprire se l'array contiene o meno un elemento che è false :

db.test.aggregate(
   [
     { $project: { 
        _id: 0,
        allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
         }
   ]
)

Risultato:

{ "allElementsTrue" : true }

In questo caso, nessuno degli elementi dell'array è false , e quindi otteniamo un risultato di true .

Quando l'array contiene false

Aggiungiamo alla raccolta il seguente documento:

{ "_id" : 2, "data" : [ true, false ] }

Ed eseguiamo $allElementsTrue contro quel documento:

db.test.aggregate(
  [
    { $match: { _id: 2 } },
    { $project: { 
      _id: 0,
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Risultato:

{ "allElementsTrue" : false }

Questa volta otteniamo false , anche se c'è un altro elemento che è true . Questo è prevedibile, perché $allElementsTrue restituisce false ogni volta che c'è almeno un elemento che è false , indipendentemente da quanti altri elementi sono veri.

Matrici vuote

Gli array vuoti restituiscono true .

Supponiamo di aggiungere il seguente documento alla nostra raccolta:

{ "_id" : 3, "data" : [ ] }

Questo documento contiene un array vuoto.

Ora eseguiamo $allElementsTrue ancora:

db.test.aggregate(
  [
    { $match: { _id: 3 } },
    { $project: { 
      _id: 0,
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Risultato:

{ "allElementsTrue" : true }

Come previsto, restituisce true .

Valori nulli, 0 e non definiti

Non è del tutto vero che $allElementsTrue restituisce false solo quando l'array contiene false .

Il $allElementsTrue anche l'operatore restituisce false ogni volta che un array contiene null , 0 o undefined valori.

Supponiamo di aggiungere i seguenti documenti alla nostra raccolta:

{ "_id" : 4, "data" : [ 1, null, 3 ] }
{ "_id" : 5, "data" : [ 1, undefined, 3 ] }
{ "_id" : 6, "data" : [ 0, 1, 2 ] }

L'array di ogni documento contiene un elemento di null , 0 o undefined .

Ora eseguiamo $allElementsTrue contro quei documenti:

db.test.aggregate(
  [
    { $match: {_id: { $in: [4,5,6] }} },
    { $project: { 
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Risultato:

{ "_id" : 4, "allElementsTrue" : false }
{ "_id" : 5, "allElementsTrue" : false }
{ "_id" : 6, "allElementsTrue" : false }

Tutti i documenti restituiscono false come previsto.

Matrici nidificate

Se l'array contiene un array nidificato che contiene un elemento che è false , allora non è sufficiente per $allElementsTrue per restituire false . Per quanto riguarda $allElementsTrue è interessato, l'array nidificato è l'elemento, e quindi non false .

Per dimostrare cosa intendo, supponiamo di inserire i seguenti documenti:

{ "_id" : 7, "data" : [ 1, [ false ], 3 ] }
{ "_id" : 8, "data" : [ 1, [ false ], false ] }

Ora eseguiamo $allElementsTrue contro quei due documenti:

db.test.aggregate(
  [
    { $match: {_id: { $in: [7,8] }} },
    { $project: { 
      allElementsTrue: { $allElementsTrue: [ "$data" ] } } 
        }
  ]
)

Risultato:

{ "_id" : 7, "allElementsTrue" : true }
{ "_id" : 8, "allElementsTrue" : false }

Possiamo vedere che il primo documento ha restituito true e il secondo ha restituito false .

Questo perché, nel primo documento, il false value è nidificato all'interno di un altro array e quindi non conta come false value (ovvero l'array stesso è il valore).

Il secondo documento, tuttavia, contiene anche false come uno degli elementi dell'array e, quindi, quel valore è ciò che causa $allElementsTrue per restituire false .