sql >> Database >  >> NoSQL >> MongoDB

MongoDB $anyElementTrue

In MongoDB is de $anyElementTrue aggregatiepijplijnoperator evalueert een array als een set en retourneert true als een van de elementen true is .

Als geen van de elementen true is , dan retourneert het 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 $anyElementTrue om erachter te komen of de array al dan niet elementen bevat die als true worden geëvalueerd :

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

Resultaat:

{ "anyElementTrue" : true }

In dit geval evalueren alle array-elementen naar true (d.w.z. ze zijn niet false , null , 0 , of undefined ), en dus krijgen we een resultaat van true .

Als geen enkel element waar is

Laten we het volgende document aan de collectie toevoegen:

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

En laten we $anyElementTrue . uitvoeren tegen dat document:

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

Resultaat:

{ "anyElementTrue" : false }

Zoals we hier kunnen zien, $anyElementTrue evalueert tot false wanneer een array false . bevat , null , 0 , of undefined waarden.

Als de array zowel waar als onwaar bevat

Laten we het volgende document aan de collectie toevoegen:

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

En laten we $anyElementTrue . uitvoeren tegen dat document:

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

Resultaat:

{ "anyElementTrue" : true }

We krijgen true , ook al is er een ander element dat false is . Dit is te verwachten, omdat $anyElementTrue retourneert true wanneer er ten minste één element is dat true is , ongeacht hoeveel andere elementen onwaar zijn.

Lege arrays

Lege arrays retourneren true .

Stel dat we het volgende document aan onze collectie toevoegen:

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

Dit document bevat een lege array.

Laten we nu $anyElementTrue . uitvoeren nogmaals:

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

Resultaat:

{ "anyElementTrue" : false }

Het retourneert false , omdat een lege array niet false is .

Geneste arrays

De $anyElementTrue operator doet niet afdalen in alle geneste arrays. Het evalueert de array op het hoogste niveau.

Dus of de geneste array elementen bevat die true zijn? of false is niet relevant voor $anyElementTrue . Voor zover $anyElementTrue betreft, is de geneste array het element, en daarom true .

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

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

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

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

Resultaat:

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

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

Dit komt omdat de array in het eerste document een geneste array bevat, wat voldoende is om true te retourneren , ongeacht de inhoud ervan.

Het tweede document bevat geen geneste array - het bevat slechts twee false waarden – en daarom evalueert het naar false .


  1. Bouw een reactieve publicatie met extra velden in elk document

  2. Hoe bereikt Redis de hoge doorvoer en prestaties?

  3. mongo-commando wordt niet herkend bij het proberen verbinding te maken met een mongodb-server

  4. Bepalen waarom Redis elke minuut of twee een SIGTERM ontvangt