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 .