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

MongoDB $allElementsTrue

Dans MongoDB, le $allElementsTrue l'opérateur de pipeline d'agrégation évalue un tableau comme un ensemble et renvoie true si aucun élément du tableau n'est false .

Si le tableau contient un élément qui est false , puis $allElementsTrue 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 $allElementsTrue pour savoir si le tableau contient ou non un élément false :

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

Résultat :

{ "allElementsTrue" : true }

Dans ce cas, aucun des éléments du tableau n'est false , et nous obtenons donc un résultat de true .

Lorsque le tableau contient False

Ajoutons le document suivant à la collection :

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

Et lançons $allElementsTrue contre ce document :

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

Résultat :

{ "allElementsTrue" : false }

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

Tableaux vides

Les tableaux vides renvoient true .

Supposons que nous ajoutions le document suivant à notre collection :

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

Ce document contient un tableau vide.

Exécutons maintenant $allElementsTrue encore :

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

Résultat :

{ "allElementsTrue" : true }

Comme prévu, il renvoie true .

Valeurs nulles, 0 et indéfinies

Ce n'est pas tout à fait vrai que $allElementsTrue est évalué à false uniquement lorsque le tableau contient false .

Le $allElementsTrue l'opérateur est également évalué à false chaque fois qu'un tableau contient null , 0 , ou undefined valeurs.

Supposons que nous ajoutions les documents suivants à notre collection :

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

Le tableau de chaque document contient un élément soit null , 0 , ou undefined .

Exécutons maintenant $allElementsTrue contre ces documents :

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

Résultat :

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

Tous les documents renvoient false comme prévu.

Tableaux imbriqués

Si le tableau contient un tableau imbriqué qui contient un élément qui est false , cela ne suffit pas pour $allElementsTrue pour retourner false . En ce qui concerne $allElementsTrue est concerné, le tableau imbriqué est l'élément, et donc pas false .

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

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

Exécutons maintenant $allElementsTrue contre ces deux documents :

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

Résultat :

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

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

En effet, dans le premier document, le false la valeur est imbriquée dans un autre tableau et ne compte donc pas comme un false valeur (c'est-à-dire que le tableau lui-même est la valeur).

Cependant, le deuxième document contient également false comme l'un des éléments du tableau, et par conséquent, cette valeur est ce qui cause $allElementsTrue évaluer à false .