sql >> Database >  >> NoSQL >> MongoDB

MongoDB $allElementsTrue

In MongoDB, de $allElementsTrue aggregatiepijplijnoperator evalueert een array als een set en retourneert true als geen enkel element in de array false is .

Als de array een element bevat dat false is , dan $allElementsTrue retourneert false .

Het element van een array is true als het niet false is , null , 0 , of undefined .

Voorbeeld

Stel dat we een verzameling hebben met het volgende document:

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

Dit document bevat een array.

We kunnen de volgende query uitvoeren met $allElementsTrue om erachter te komen of de array al dan niet een element bevat dat false is :

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

Resultaat:

{ "allElementsTrue" : true }

In dit geval is geen van de array-elementen false , en dus krijgen we een resultaat van true .

Als de array False bevat

Laten we het volgende document aan de collectie toevoegen:

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

En laten we $allElementsTrue . uitvoeren tegen dat document:

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

Resultaat:

{ "allElementsTrue" : false }

Deze keer krijgen we false , ook al is er een ander element dat true is . Dit is te verwachten, omdat $allElementsTrue retourneert false wanneer er ten minste één element is dat false . is , ongeacht hoeveel andere elementen waar zijn.

Lege arrays

Lege arrays retourneren true .

Stel dat we het volgende document aan onze collectie toevoegen:

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

Dit document bevat een lege array.

Laten we nu $allElementsTrue . uitvoeren nogmaals:

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

Resultaat:

{ "allElementsTrue" : true }

Zoals verwacht, retourneert het true .

Null-, 0- en ongedefinieerde waarden

Het is niet helemaal waar dat $allElementsTrue evalueert tot false alleen wanneer de array false . bevat .

De $allElementsTrue operator evalueert ook naar false wanneer een array null . bevat , 0 , of undefined waarden.

Stel dat we de volgende documenten aan onze collectie toevoegen:

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

De array van elk document bevat een element van ofwel null , 0 , of undefined .

Laten we nu $allElementsTrue . uitvoeren tegen die documenten:

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

Resultaat:

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

Alle documenten retourneren false zoals verwacht.

Geneste arrays

Als de array een geneste array bevat die een element bevat dat false is , dan is dat niet genoeg voor $allElementsTrue om false terug te geven . Voor zover $allElementsTrue betreft, is de geneste array het element, en dus niet false .

Laten we, om te demonstreren wat ik bedoel, de volgende documenten invoegen:

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

Laten we nu $allElementsTrue . uitvoeren tegen die twee documenten:

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

Resultaat:

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

We kunnen zien dat het eerste document true returned retourneerde en de tweede retourneerde false .

Dit komt omdat in het eerste document de false waarde is genest in een andere array en telt daarom niet als een false waarde (d.w.z. de array zelf is de waarde).

Het tweede document bevat echter ook false als een van de array-elementen, en daarom is die waarde de oorzaak van $allElementsTrue te evalueren tot false .


  1. TTL voor een vast lid

  2. Relationele DB in het geheugen?

  3. MongoDB $ min

  4. MongoDB Vervang specifieke array-waarden