Dans MongoDB, vous pouvez utiliser le $isArray
opérateur de pipeline d'agrégation pour vérifier si une valeur est un tableau ou non.
Il accepte toute expression valide et renvoie true
si l'expression est un tableau, false
si ce n'est pas le cas.
Exemple
Supposons que nous ayons une collection appelée test
avec les documents suivants :
{ "_id" : 1, "data" : [ ] } { "_id" : 2, "data" : [ 1, 2, 3 ] } { "_id" : 3, "data" : [ "XS", "M", "L" ] } { "_id" : 4, "data" : 123 } { "_id" : 5, "data" : "Homer Jay" }
Nous pouvons utiliser le code suivant pour vérifier les data
champ pour les tableaux :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Résultat :
{ "_id" : 1, "data" : [ ], "result" : true } { "_id" : 2, "data" : [ 1, 2, 3 ], "result" : true } { "_id" : 3, "data" : [ "XS", "M", "L" ], "result" : true } { "_id" : 4, "data" : 123, "result" : false } { "_id" : 5, "data" : "Homer Jay", "result" : false }
Nous pouvons voir que les trois premiers documents contiennent des tableaux et les deux autres non.
De plus, nous pouvons voir que le premier document contient un tableau vide. C'est toujours un tableau, et donc $isArray
renvoie true
.
Exemple 2
Voici un autre exemple qui contient divers champs de différents types de BSON.
Supposons que nous ayons une collection appelée types
avec le document suivant :
{ "_id" : ObjectId("601738d7c8eb4369cf6ad9de"), "double" : 123.75, "string" : "123", "boolean" : true, "date" : ISODate("2020-12-31T23:30:15.123Z"), "integer" : 123, "long" : NumberLong(123), "decimal" : NumberDecimal("123.75"), "object" : { "a" : 1 }, "array" : [ 1, 2, 3 ] }
Pour les besoins de cet article, j'ai nommé chaque champ pour refléter son type BSON.
Nous pouvons maintenant utiliser le code suivant pour renvoyer soit true
ou false
pour chaque champ, selon que le champ est un tableau ou non :
db.types.aggregate(
[
{
$project:
{
_id: { $isArray: "$_id" },
double: { $isArray: "$double" },
string: { $isArray: "$string" },
boolean: { $isArray: "$boolean" },
date: { $isArray: "$date" },
integer: { $isArray: "$integer" },
long: { $isArray: "$long" },
decimal: { $isArray: "$decimal" },
object: { $isArray: "$object" },
array: { $isArray: "$array" }
}
}
]
).pretty()
Résultat :
{ "_id" : false, "double" : false, "string" : false, "boolean" : false, "date" : false, "integer" : false, "long" : false, "decimal" : false, "object" : false, "array" : true }
Champ manquant
Application de $isArray
à un champ qui n'existe pas donne false
.
Supposons que notre test
collection contient le document suivant :
{ "_id" : 6 }
Et nous appliquons $isArray
à ce document :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Résultat :
{ "_id" : 6, "result" : false }
Valeurs nulles
Application de $isArray
à null
renvoie false
.
Supposons que notre test
collection contient le document suivant :
{ "_id" : 7, "data" : null }
Et nous appliquons $isArray
à ce document :
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Résultat :
{ "_id" : 7, "data" : null, "result" : false }
Valeurs non définies
De même, fournir des valeurs indéfinies renvoie false
.
Supposons que notre test
collection contient le document suivant :
{ "_id" : 8, "data" : undefined }
Appliquer $isArray
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 1,
data: 1,
result: { $isArray: "$data" }
}
}
]
)
Résultat :
{ "_id" : 8, "data" : undefined, "result" : false }