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
.