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

MongoDB $anyElementTrue

In MongoDB, il $anyElementTrue l'operatore della pipeline di aggregazione valuta un array come un set e restituisce true se uno qualsiasi degli elementi è true .

Se nessuno degli elementi è true , quindi 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 $anyElementTrue per scoprire se l'array contiene o meno elementi che restituiscono true :

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

Risultato:

{ "anyElementTrue" : true }

In questo caso, tutti gli elementi dell'array restituiscono true (cioè non sono false , null , 0 o undefined ), e quindi otteniamo un risultato di true .

Quando nessun elemento è vero

Aggiungiamo alla raccolta il seguente documento:

{ "_id" : 2, "data" : [ false, undefined, 0, null ] }

Ed eseguiamo $anyElementTrue contro quel documento:

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

Risultato:

{ "anyElementTrue" : false }

Come possiamo vedere qui, $anyElementTrue restituisce false ogni volta che un array contiene false , null , 0 o undefined valori.

Quando l'array contiene sia True che False

Aggiungiamo alla raccolta il seguente documento:

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

Ed eseguiamo $anyElementTrue contro quel documento:

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

Risultato:

{ "anyElementTrue" : true }

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

Matrici vuote

Gli array vuoti restituiscono true .

Supponiamo di aggiungere il seguente documento alla nostra raccolta:

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

Questo documento contiene un array vuoto.

Ora eseguiamo $anyElementTrue ancora:

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

Risultato:

{ "anyElementTrue" : false }

Restituisce false , perché un array vuoto non è false .

Matrici nidificate

Il $anyElementTrue l'operatore non scendere in qualsiasi array nidificato. Valuta l'array al livello superiore.

Pertanto, se l'array nidificato contiene elementi che sono true o false è irrilevante per $anyElementTrue . Per quanto riguarda $anyElementTrue è interessato, l'array nidificato è l'elemento, e quindi true .

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

{ "_id" : 5, "data" : [ false, [ false ] ] }
{ "_id" : 6, "data" : [ false, false ] }

Ora eseguiamo $anyElementTrue contro quei due documenti:

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

Risultato:

{ "_id" : 5, "anyElementTrue" : true }
{ "_id" : 6, "anyElementTrue" : false }

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

Questo perché l'array nel primo documento contiene un array nidificato, che è sufficiente per restituire true , indipendentemente dal suo contenuto.

Il secondo documento non contiene un array nidificato:contiene solo due false valori – e quindi restituisce false .