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
.