MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $anyElementTrue

Dans MongoDB, le $anyElementTrue l'opérateur de pipeline d'agrégation évalue un tableau comme un ensemble et renvoie true si l'un des éléments est true .

Si aucun des éléments n'est true , puis il renvoie false .

L'élément d'un tableau est true si ce n'est pas false , null , 0 , ou undefined .

Exemple

Supposons que nous ayons une collection avec le document suivant :

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

Ce document contient un tableau.

Nous pouvons exécuter la requête suivante avec $anyElementTrue pour savoir si le tableau contient ou non des éléments évalués à true :

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

Résultat :

{ "anyElementTrue" : true }

Dans ce cas, tous les éléments du tableau sont évalués à true (c'est-à-dire qu'ils ne sont pas false , null , 0 , ou undefined ), et nous obtenons donc un résultat de true .

Quand aucun élément n'est vrai

Ajoutons le document suivant à la collection :

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

Et lançons $anyElementTrue contre ce document :

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

Résultat :

{ "anyElementTrue" : false }

Comme nous pouvons le voir ici, $anyElementTrue est évalué à false chaque fois qu'un tableau contient false , null , 0 , ou undefined valeurs.

Lorsque le tableau contient à la fois vrai et faux

Ajoutons le document suivant à la collection :

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

Et lançons $anyElementTrue contre ce document :

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

Résultat :

{ "anyElementTrue" : true }

Nous obtenons true , même s'il y a un autre élément qui est false . C'est normal, car $anyElementTrue renvoie true chaque fois qu'il y a au moins un élément qui est true , quel que soit le nombre d'autres éléments qui sont faux.

Tableaux vides

Les tableaux vides renvoient true .

Supposons que nous ajoutions le document suivant à notre collection :

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

Ce document contient un tableau vide.

Exécutons maintenant $anyElementTrue encore :

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

Résultat :

{ "anyElementTrue" : false }

Il renvoie false , car un tableau vide n'est pas false .

Tableaux imbriqués

Le $anyElementTrue l'opérateur ne le fait pas descendre dans n'importe quel tableau imbriqué. Il évalue le tableau au niveau supérieur.

Par conséquent, si le tableau imbriqué contient des éléments qui sont true ou false n'est pas pertinent pour $anyElementTrue . En ce qui concerne $anyElementTrue est concerné, le tableau imbriqué est l'élément, et donc true .

Pour illustrer ce que je veux dire, supposons que nous insérions les documents suivants :

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

Exécutons maintenant $anyElementTrue contre ces deux documents :

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

Résultat :

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

Nous pouvons voir que le premier document a renvoyé true et le second a renvoyé false .

En effet, le tableau du premier document contient un tableau imbriqué, ce qui est suffisant pour renvoyer true , quel que soit son contenu.

Le deuxième document ne contient pas de tableau imbriqué - il ne contient que deux false valeurs - et il est donc évalué à false .