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

MongoDB $anyElementTrue

I MongoDB er $anyElementTrue aggregeringspipeline-operatør evaluerer et array som et sæt og returnerer true hvis nogen af ​​elementerne er true .

Hvis ingen af ​​elementerne er true , så returnerer den false .

Et arrays element er true hvis det ikke er false , null , 0 eller undefined .

Eksempel

Antag, at vi har en samling med følgende dokument:

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

Dette dokument indeholder et array.

Vi kan køre følgende forespørgsel med $anyElementTrue for at finde ud af, om arrayet indeholder elementer, der evalueres til true :

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

Resultat:

{ "anyElementTrue" : true }

I dette tilfælde evalueres alle array-elementer til true (dvs. de er ikke false , null , 0 eller undefined ), og så får vi et resultat af true .

Når intet element er sandt

Lad os tilføje følgende dokument til samlingen:

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

Og lad os køre $anyElementTrue mod dette dokument:

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

Resultat:

{ "anyElementTrue" : false }

Som vi kan se her, $anyElementTrue evalueres til false hver gang et array indeholder false , null , 0 eller undefined værdier.

Når arrayet indeholder både sandt og falsk

Lad os tilføje følgende dokument til samlingen:

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

Og lad os køre $anyElementTrue mod dette dokument:

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

Resultat:

{ "anyElementTrue" : true }

Vi får true , selvom der er et andet element, der er false . Dette kan forventes, fordi $anyElementTrue returnerer true når der er mindst ét ​​element, der er true , uanset hvor mange andre elementer der er falske.

Tomme arrays

Tomme arrays returnerer true .

Antag, at vi tilføjer følgende dokument til vores samling:

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

Dette dokument indeholder et tomt array.

Lad os nu køre $anyElementTrue igen:

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

Resultat:

{ "anyElementTrue" : false }

Det returnerer false , fordi et tomt array ikke er false .

Indlejrede arrays

$anyElementTrue operatør ikke gå ned i alle indlejrede arrays. Den evaluerer arrayet på øverste niveau.

Derfor, om det indlejrede array indeholder elementer, der er true eller false er irrelevant for $anyElementTrue . Så vidt $anyElementTrue er bekymret, er det indlejrede array elementet og derfor true .

For at demonstrere, hvad jeg mener, antag, at vi indsætter følgende dokumenter:

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

Lad os nu køre $anyElementTrue mod disse to dokumenter:

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

Resultat:

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

Vi kan se, at det første dokument returnerede true og den anden returnerede false .

Dette skyldes, at arrayet i det første dokument indeholder en indlejret array, som er nok til at returnere true , uanset indholdet.

Det andet dokument indeholder ikke et indlejret array - det indeholder kun to false værdier – og den evalueres derfor til false .


  1. Hvordan laver jeg en NOT IN-forespørgsel i Mongo?

  2. Føj data til eksisterende gridfs-fil

  3. Flere Redis-forekomster

  4. problemer med at oprette forbindelse til redis at gå med med flere arbejder kues